Sto lavorando con un codice in cui un oggetto, "pippo", sta creando un altro oggetto , "barra", e lo passa a Callable
. Dopo questo foo restituirà la barra , e poi voglio che foo diventi irraggiungibile (es .: disponibile per la garbage collection ).Le classi anonime * sempre * mantengono un riferimento alla loro istanza allegata?
Il mio primo pensiero era di creare lo Callable
in modo anonimo. es:
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);
}
};
}
}
Pensai che questo non potrebbe effettivamente funzionare come desiderato, tuttavia, come una classe interna tipicamente mantiene un riferimento al suo oggetto contenitore. Non desidero un riferimento alla classe di inclusione qui, perché voglio che l'oggetto che racchiude sia raccolto mentre lo Callable
è ancora raggiungibile.
D'altra parte, rilevare che l'istanza che racchiude non è mai in realtà di cui dovrebbe essere abbastanza banale, quindi forse il compilatore Java è abbastanza intelligente di non includere un riferimento in questo caso.
Quindi ... un'istanza di una classe interna anonima si aggrappa a un riferimento all'istanza che lo include anche se non utilizza mai effettivamente il riferimento di istanza che include?
Utilizzare decisamente una classe statica. Non è quel verboso IMO. –
@deepc È necessario aggiungere campi per ogni parametro, ovvero 1 riga per parametro e un costruttore, che aggiunge 2 righe più 1 per ogni parametro. Quindi per un semplice Runnable a 3 argomenti ci sono almeno altre 8 righe di codice. La sintassi anonima della classe interna è già piuttosto prolissa rispetto a una sintassi di espressione lambda corretta: una singola classe di metodo ha 4 righe di testo non necessarie con espressioni lambda. Quindi un'espressione lambda a 3 parametri a 1 riga in Java diventa 13 righe di codice. Quanto dovrebbe essere grande per te considerarlo "quel verboso"? –
hai ragione con la tua linea "statistiche". Forse è un gusto personale. Ma dopotutto deve esserci anche il metodo 'call()'. E ora abbiamo abbastanza codice per giustificare una classe separata (non necessariamente una classe di livello superiore come fai notare). Per me il codice sembra più pulito in questo modo. Ancor di più se quel metodo è più lungo di poche righe. –