una otra instanciar funcion externas ejemplo dentro constructores como clases clase anonimas anonima anidados anidadas anidada java constructor overloading anonymous-types

otra - funcion anonima java



Accediendo al constructor de una clase anĂ³nima. (10)

Digamos que tengo una clase concreta de clase 1 y estoy creando una clase anónima a partir de ella.

Object a = new Class1(){ void someNewMethod(){ } };

Ahora hay alguna forma en que podría sobrecargar al constructor de esta clase anónima. Como se muestra abajo

Object a = new Class1(){ void someNewMethod(){ } public XXXXXXXX(int a){ super(); System.out.println(a); } };

¿Con algo en xxxxxxxx para nombrar el constructor?


Aquí hay otra manera de solucionar el problema:

public class Test{ public static final void main(String...args){ new Thread(){ private String message = null; Thread initialise(String message){ this.message = message; return this; } public void run(){ System.out.println(message); } }.initialise(args[0]).start(); } }


De la especificación del lenguaje Java , sección 15.9.5.1:

Una clase anónima no puede tener un constructor declarado explícitamente.

Lo siento :(

EDITAR: Como alternativa, puede crear algunas variables locales finales y / o incluir un inicializador de instancia en la clase anónima. Por ejemplo:

public class Test { public static void main(String[] args) throws Exception { final int fakeConstructorArg = 10; Object a = new Object() { { System.out.println("arg = " + fakeConstructorArg); } }; } }

Está malhumorado, pero podría ayudarte. Alternativamente, use una clase anidada adecuada :)


En mi caso, una clase local (con un constructor personalizado) funcionó como una clase anónima:

Object a = getClass1(x); public Class1 getClass1(int x) { class Class2 implements Class1 { void someNewMethod(){ } public Class2(int a){ super(); System.out.println(a); } } Class1 c = new Class2(x); return c; }


Eso no es posible, pero puede agregar un inicializador anónimo como este:

final int anInt = ...; Object a = new Class1() { { System.out.println(anInt); } void someNewMethod() { } };

No olvide las declaraciones finales de variables o parámetros locales utilizados por la clase anónima, como lo hice para anInt.


No tiene sentido tener un constructor sobrecargado con nombre en una clase anónima, ya que de todos modos no habría manera de llamarlo.

Dependiendo de lo que realmente esté tratando de hacer, simplemente acceder a una variable local final declarada fuera de la clase, o usar un inicializador de instancia como lo muestra Arne, podría ser la mejor solución.


Puede tener un constructor en la clase abstracta que acepte los parámetros de inicio. La especificación de Java solo especifica que la clase anónima, que es la descendencia de la clase abstracta (opcionalmente) o la implementación de una interfaz, no puede tener un constructor por derecho propio.

Lo siguiente es absolutamente legal y posible:

static abstract class Q{ int z; Q(int z){ this.z=z;} void h(){ Q me = new Q(1) { }; } }

Si tiene la posibilidad de escribir la clase abstracta usted mismo, coloque ese constructor allí y use una API fluida donde no haya una solución mejor. De esta manera, puede anular el constructor de su clase original creando una clase hermana con un constructor con parámetros y usarlo para crear una instancia de su clase anónima.


Sé que el hilo es demasiado viejo para publicar una respuesta. Pero aun así creo que vale la pena.

Aunque no puede tener un constructor explícito, si su intención es llamar al constructor de la súper clase, lo siguiente es todo lo que tiene que hacer.

StoredProcedure sp = new StoredProcedure(datasource, spName) { {// init code if there are any} };

Este es un ejemplo de StoredProcedure crear un objeto StoredProcedure en Spring pasando un DataSource y un objeto String .

Entonces, la línea inferior es, si desea crear una clase anónima y desea llamar al constructor de la superclase, cree la clase anónima con una firma que coincida con el constructor de la superclase .


Sí, es correcto que no pueda definir constructo en una clase anónima, pero eso no significa que la clase anónima no tenga constructor. Confundir ... En realidad, no se puede definir la construcción en una clase anónima, pero el compilador genera un constructor para ella con la misma firma que su constructor primario llamado. Si el padre tiene más de un constructor, el anónimo tendrá uno y solo un constructor


Si no necesita pasar argumentos, entonces el código de inicialización es suficiente, pero si necesita pasar argumentos de un contralutor, hay una manera de resolver la mayoría de los casos:

Boolean var= new anonymousClass(){ private String myVar; //String for example @Overriden public Boolean method(int i){ //use myVar and i } public String setVar(String var){myVar=var; return this;} //Returns self instane }.setVar("Hello").method(3);


The IAQ de Peter Norvig: Preguntas con poca frecuencia respondidas

http://norvig.com/java-iaq.html#constructors - Contructores de clase anónimos

http://norvig.com/java-iaq.html#init - Construtors e inicialización

Sumando, puedes construir algo como esto ..

public class ResultsBuilder { Set<Result> errors; Set<Result> warnings; ... public Results<E> build() { return new Results<E>() { private Result[] errorsView; private Result[] warningsView; { errorsView = ResultsBuilder.this.getErrors(); warningsView = ResultsBuilder.this.getWarnings(); } public Result[] getErrors() { return errorsView; } public Result[] getWarnings() { return warningsView; } }; } public Result[] getErrors() { return !isEmpty(this.errors) ? errors.toArray(new Result[0]) : null; } public Result[] getWarnings() { return !isEmpty(this.warnings) ? warnings.toArray(new Result[0]) : null; } }