J'ai vu des objets créés en code Java sans stocker une référence à l'objet. Par exemple, dans un plugin Eclipse, j'ai vu un SWT Shell créé comme suit:
new Shell();
Ce nouvel objet Shell n'est pas stocké dans une variable, mais restera référencé jusqu'à ce que la fenêtre soit supprimée, ce qui [je crois?] Se produit par défaut lorsque la fenêtre est fermée.
Est-ce une mauvaise pratique de créer des objets comme celui-ci sans y stocker une référence? Ou la bibliothèque était-elle mal conçue? Et si je n'ai pas besoin d'une référence, mais que je veux seulement les "effets secondaires" de l'objet? Dois-je quand même enregistrer une référence?
MISE À JOUR:
Certes, mon exemple ci-dessus est pauvre. Bien que j'aie vu des éléments d'interface utilisateur créés comme celui-ci, la création d'un shell SWT comme celui-ci serait probablement inutile car vous devez appeler la méthode open sur l'instance Shell. Il y a de meilleurs exemples fournis par aix tels que les suivants du tutoriel de concurrence Java :
(new HelloThread()).start();
Cette pratique est observée dans de nombreux contextes, de sorte que les questions demeurent. Est-ce une bonne pratique?
Shell.createTopLevelShell()
ou quoi que ce soit, par rapport à l'utilisation d'un constructeur dans ce cas. Mais fonctionnellement il y a peu de différence.)dispose()
d: Règle 1: Si vous les avez créés, vous les supprimez. eclipse.org/articles/swt-design-2/swt-design-2.htmlRéponses:
Il y a un élément de préférence personnelle à cela, mais je pense que ne pas stocker la référence n'est pas nécessairement une mauvaise pratique.
Prenons l'exemple hypothétique suivant:
Si un nouvel objet processeur doit être créé pour chaque fichier et n'est pas nécessaire après l'
process()
appel, il ne sert à rien d' en stocker une référence.Voici un autre exemple, tiré du didacticiel de concurrence Java :
J'ai vu de nombreux autres exemples lorsque la référence n'est pas stockée, et qui se lisaient parfaitement bien à mes yeux, tels que:
(L'
StringBuilder
objet n'est pas conservé.)Il existe des modèles similaires impliquant common.lang's
HashCodeBuilder
et al.la source
getInstance()
est une usine et non un singleton).process
.Si vous n'avez pas besoin d' une référence à l'objet créé, ne vous accrochez pas à la référence. C'est aussi simple que ça.
la source
En général, il est recommandé de publier les références aussi rapidement que possible. Je ne vois aucune différence entre:
et
En ce qui concerne le code, vous évitez simplement d'utiliser un nom de variable, ce qui pourrait être une chose positive. Le compilateur JIT est généralement assez intelligent pour reconnaître qu'il peut récupérer le thread après sa dernière utilisation, il n'y a donc probablement aucune différence du point de vue des performances.
Le seul vrai problème à éviter est le code dans le constructeur Anti-Pattern , mais il ne semble pas que ce soit ce que vous demandez.
la source
Cela peut être mauvais si vous utilisez SWT, car vous devez nettoyer après vous-même (en appelant la méthode dispose ()). Mais pour les autres classes (non SWT) ça va.
Voici un article sur la gestion des ressources du système d'exploitation
la source
Tout d'abord, vous allez ennuyer les gens qui ont appris le C ou le C ++ avant Java. Je vais laisser cela comme un exercice pour que le lecteur décide si c'est un pour ou un contre.
Bien qu'il existe certainement des situations dans lesquelles les objets sont conçus pour être de très courte durée, la plupart du temps si quelque chose est suffisamment complexe pour créer un objet, il est suffisamment complexe pour avoir de bonnes raisons de conserver une référence, donc ne pas le conserver devrait être au moins un avertissement pour vérifier si vous avez oublié quelque chose.
Par exemple, dans un didacticiel, personne ne se soucie de conserver une référence de thread, mais dans la vie réelle, si quelque chose prend suffisamment de temps pour que vous souhaitiez générer un thread, cela prend généralement assez de temps pour que vous puissiez être en mesure d'annuler le thread. Ou si la durée de vie est plus courte, vous générez généralement un tas de fils que vous voudrez
join
avant de continuer. Ou vous voulez vous assurer que la création de votre thread a bien réussi. Ou vous voulez vous assurer que le fil se termine proprement avant de quitter. Vous obtenez l'image.la source