Uberto Barbini [email protected] [it-torino-java-jug] ha scritto il 
 > In tutti i casi pero', anche se volessi restituire una collezione di
> Object non c'e' memory leak comunque, non sono inner class ma classi 
> anonime senza alcun rapporto con la classe principale.
> C'e' una inner class creata implicitamente dalla lambda, ma quella 
> finisce col ciclo.


Le classi anonime sono inner class, e quindi hanno un riferimento alla 
classe padre, piaccia o no
Quello che descrivi invece è una static inner class, che però non può 
essere anonima

Visto che la tupla dell'esempio di Simone non è utile a tornare dati, 
cambio l'esempio usando una mappa e la sintassi delle doppie parentesi 
graffe

https://gist.github.com/ffissore/e4915691cc539b0954faf815609cdceb

"...new HashMap() {..." è una inner class, anonima, e può accedere alla 
classe genitore con la sintassi "Filter3.this."
Nel metodo "inspectInOtherMethod", l'instanza di Filter3 non è 
raggiungibile, eppure la mappa restituita è in grado di accedere ai suoi 
metodi.

Se serve altra letteratura a proposito, Lukas Eder in questo post lo 
spiega bene [1]. Si focalizza sulle doppie parentesi graffe, ma solo 
perchè sono la sintassi più compatta per ottenere qualcosa di simile a 
una Tupla in java. La sorgente del problema memory leak è l'aver tornato 
un'istanza di una inner class

[1] 
https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/

NB: se nelle vostre codebase usate la sintassi delle doppie graffe, 
buttatele e migrate o a "ImmutableMap.of" di Guava, o fatevi il vostro 
metodo di utilità

federico

Reply via email to