Je travaille avec du code où un objet, "foo", crée un autre objet , "bar", et lui passe un Callable
. Après ce foo retournera bar, et puis je veux que foo devienne inaccessible (ie: disponible pour garbage collection).Est-ce que les classes anonymes * * maintiennent toujours une référence à leur instance englobante?
Ma pensée initiale était de créer simplement le Callable
anonymement. par exemple:
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);
}
};
}
}
Il me est apparu que cela ne fonctionne pas vraiment comme on le souhaite, cependant, comme une classe interne conserve généralement une référence à son objet englobante. Je ne veux pas une référence à la classe englobante ici, car je veux que l'objet englobant soit collecté tandis que le Callable
est toujours accessible.
D'autre part, détecter que l'instance englobante est ne fait référence à devrait être assez trivial, donc peut-être le compilateur Java est assez intelligent de ne pas inclure une référence dans ce cas. Alors ... une instance d'une classe interne anonyme conservera-t-elle une référence à son instance englobante même si elle n'utilise jamais réellement la référence d'instance englobante ?
Utilisez certainement une classe statique. Ce n'est pas ce IMO verbeux. –
@deepc Vous devez ajouter des champs pour chaque paramètre, soit 1 ligne par paramètre, et un constructeur, qui ajoute 2 lignes plus 1 pour chaque paramètre. Donc, pour un Runnable simple à 3 arguments, c'est au moins 8 lignes de code de plus. La syntaxe de classe interne anonyme est déjà assez verbeuse par rapport à une syntaxe d'expression lambda correcte: une seule classe de méthode a 4 lignes de liste déroulante dont vous n'avez pas besoin avec des expressions lambda. Ainsi, une expression lambda à 1 ligne à 3 paramètres en Java devient 13 lignes de code. À quel point cela devrait-il être pour vous de le considérer comme «verbeux»? –
vous avez raison avec votre ligne "statistiques". Peut-être que c'est un goût personnel. Mais après tout, la méthode 'call()' doit être là aussi. Et maintenant, nous avons assez de code pour justifier une classe séparée (pas nécessairement une classe de haut niveau comme vous le signalez). Pour moi, le code semble plus propre de cette façon. Encore plus si cette méthode est plus longue que quelques lignes. –