Estoy trabajando con un código en el que un objeto, "foo", crea otro objeto , "barra", y le pasa un Callable
. Después de este foo devolverá bar, y luego quiero que foo sea inalcanzable (es decir, disponible para recolección de basura).Hacer clases anónimas * siempre * ¿mantener una referencia a su instancia adjunta?
Mi primer pensamiento fue crear el Callable
de forma anónima. por ejemplo:
class Foo {
...
public Bar createBar() {
final int arg1 = ...
final int arg2 = ...
final int arg3 = ...
return new Callable<Baz>() {
@Override
public Baz call() {
return new Baz(arg1, arg2, arg3);
}
};
}
}
Se me ocurrió que esto no podría funcionar como se desee, sin embargo, como una clase interna normalmente mantiene una referencia a su objeto de cerramiento. No deseo una referencia a la clase adjunta aquí, porque quiero que el objeto adjunto sea recopilado mientras que el Callable
aún se puede alcanzar.
Por otro lado, detectar que la instancia que encierra no se conoce realmente a debe ser bastante trivial, así que quizás el compilador Java es lo suficientemente inteligente como para que no incluya una referencia en ese caso.
Entonces ... ¿una instancia de una clase interna anónima se aferrará a una referencia a su instancia adjunta incluso si nunca utiliza realmente la referencia de instancia que contiene ?
Definitivamente el uso de una clase estática. No es esa OMI detallada. –
@deepc Necesita agregar campos para cada parámetro, que es 1 línea por parámetro, y un constructor, que agrega 2 líneas más 1 para cada parámetro. Entonces, para un Runnable simple de 3 argumentos, hay al menos 8 líneas más de código. La sintaxis anónima de la clase interna ya es bastante detallada en comparación con una sintaxis de expresión lambda adecuada: una sola clase de método tiene 4 líneas de texto repetitivo que no necesitarías con expresiones lambda. Entonces, una expresión lambda de 3 líneas y 1 parámetro en Java se convierte en 13 líneas de código. ¿Qué tan grande debería ser para ti considerarlo "tan detallado"? –
tiene razón con las "estadísticas" de su línea. Tal vez es un gusto personal. Pero después de todo, el método 'call()' tiene que estar allí también. Y ahora tenemos suficiente código para justificar una clase separada (no necesariamente una clase de nivel superior como usted señala). Para mí, el código se ve más limpio de esta manera. Aún más si ese método es más largo que unas pocas líneas. –