¿Es posible pasar parámetros o acceder a parámetros externos a una clase anónima? Por ejemplo:
int myVariable = 1;
myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// How would one access myVariable here?
}
});
¿Hay alguna forma para que el oyente acceda a myVariable o se le pase myVariable sin crear el oyente como una clase con nombre real?
java
anonymous-class
Luis
fuente
fuente
final
variables locales desde el método de inclusión.this
.Respuestas:
Técnicamente, no, porque las clases anónimas no pueden tener constructores.
Sin embargo, las clases pueden hacer referencia a variables que contienen ámbitos. Para una clase anónima, estas pueden ser variables de instancia de las clases que lo contienen o variables locales que están marcadas como finales.
editar : como señaló Peter, también puede pasar parámetros al constructor de la superclase de la clase anónima.
fuente
new ArrayList(10) { }
super()
y antes del resto del constructor real.new someclass(){ fields; {initializer} fields; methods(){} }
. Es algo así como un inicializador estático pero sin la palabra clave estática. docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6Sí, agregando un método de inicializador que devuelve 'this' e inmediatamente llamando a ese método:
No se necesita declaración 'final'.
fuente
final
objeto de referencia para poder obtener información en mis clases anónimas. ¡Gracias por compartir!init()
función tiene que volverthis
? Realmente no entiendo la sintaxis.si. Puede capturar variables, visibles para la clase interna. la única limitación es que tiene que ser final
fuente
this
cual es final.final
? No puedo encontrar ninguna alternativa. Esto puede influir en el parámetro de origen que está diseñado para serfinal
.Me gusta esto:
fuente
Esto hará la magia
fuente
Como se muestra en http://www.coderanch.com/t/567294/java/java/declare-constructor-anonymous-class , puede agregar un inicializador de instancia. Es un bloque que no tiene nombre y se ejecuta primero (como un constructor).
Parece que también se discuten en ¿Por qué inicializadores de instancias de Java? y ¿Cómo es un inicializador de instancia diferente de un constructor? discute las diferencias de los constructores.
fuente
final
variables como se describe en aav, pero esa información no se proporcionó en esta respuesta. Con mucho, la mejor respuesta es la dada por Adam Mlodzinksi (ahora uso este patrón exclusivamente, ¡no más finales!). Respaldo mi comentario de que esto no responde la pregunta formulada.Mi solución es usar un método que devuelva la clase anónima implementada. Se pueden pasar argumentos regulares al método y están disponibles dentro de la clase anónima.
Por ejemplo: (de algún código GWT para manejar un cambio de cuadro de texto):
Para este ejemplo, se haría referencia al nuevo método de clase anónimo con:
O , utilizando los requisitos del OP:
fuente
Otras personas ya han respondido que las clases anónimas solo pueden acceder a las variables finales. Pero dejan abierta la pregunta de cómo mantener la variable original no final. Adam Mlodzinski dio una solución pero está bastante hinchado. Hay una solución mucho más simple para el problema:
Si no desea
myVariable
ser definitivo, debe envolverlo en un nuevo ámbito donde no importa, si es definitivo.Adam Mlodzinski no hace nada más en su respuesta, pero con mucho más código.
fuente
init
método. Puedo agregar una línea de código adicional a mi ejemplo para tener esta variable adicional. Si eres un gran fanático de los patrones de construcción, no dudes en usarlos, pero en este caso no son necesarios.final
una solución variable.Puede usar lambdas simples ("las expresiones lambda pueden capturar variables")
o incluso una función
Usar Function es una excelente manera de refactorizar decoradores y adaptadores, consulte aquí
Acabo de empezar a aprender sobre lambdas, así que si ves un error, no dudes en escribir un comentario.
fuente
¡Una manera simple de poner algo de valor en una variable externa (no pertenece a la clase anonymus) es cómo sigue!
De la misma manera, si desea obtener el valor de una variable externa, ¡puede crear un método que devuelva lo que desea!
fuente
Pensé que las clases anónimas eran básicamente como lambdas pero con peor sintaxis ... esto resulta ser cierto, pero la sintaxis es aún peor y hace que (lo que deberían ser) las variables locales se desvanezcan en la clase que las contiene.
No puede acceder a ninguna variable final convirtiéndolas en campos de la clase principal.
P.ej
Interfaz:
clase:
No sé si lo resolvieron en Java 8 (estoy atrapado en el mundo EE y todavía no tengo 8), pero en C # se vería así:
No necesita una interfaz separada en C # tampoco ... ¡Lo extraño! Me encuentro haciendo diseños peores en Java y repitiéndome más porque la cantidad de código + complejidad que tiene que agregar en Java para reutilizar algo es peor que simplemente copiar y pegar la mayor parte del tiempo.
fuente