116 votes

Ne la définition des objets Java à null ne plus rien?

J'ai été la navigation des vieux livres et a trouvé une copie de la Pratique de "Java" par Peter Hagger. Dans la section performances, il y a une recommandation à l'objet du jeu de références à null lorsqu'il n'est plus nécessaire.

En Java, ne la définition de l'objet de références à null d'améliorer les performances ou l'efficacité de la collecte des ordures? Si oui, dans quels cas est-ce un problème? Les classes conteneur? Composition d'objet? Les classes internes anonymes?

Je vois dans le code assez souvent. Est-ce désormais obsolète de conseils de programmation ou est-elle encore utile?

80voto

Neil Coffey Points 13408

Ça dépend un peu sur vous quand vous étiez à la pensée de micropression la référence.

Si vous avez un objet en chaîne de A->B->C, alors Une fois n'est pas accessible, A, B et C seront tous admissibles pour la collecte des ordures (en supposant que rien d'autre n'est en se référant à B ou C). Il n'y a pas besoin, et n'a jamais eu besoin, pour définir explicitement les références A->B ou B->C null, par exemple.

En dehors de cela, la plupart du temps, la question n'a pas vraiment de se poser, parce que, en réalité, vous avez à traiter avec des objets dans les collections. Vous devriez toujours penser à la suppression des objets à partir de listes, cartes, etc en appelant le appropiate méthode remove ().

Le cas où il l'habitude d'être quelques conseils pour définir les références à null a été spécifiquement dans une longue portée, où un gourmand en mémoire de l'objet a cessé d'être utilisé au milieu de la portée. Par exemple:

{
  BigObject obj = ...
  doSomethingWith(obj);
  obj = null;             <-- explicitly set to null
  doSomethingElse();
}

La logique ici est que parce que obj est toujours dans la portée, puis sans le consentement micropression de la référence, il ne devient pas le garbage collector jusqu'à ce que après la doSomethingElse() la méthode complète. Et c'est le conseil qui probablement ne tient plus moderne de la Jvm: il s'avère que le compilateur JIT pouvez travailler à partir de quel moment un local donné la référence d'objet n'est plus utilisé.

26voto

Chris Jester-Young Points 102876

Non, il n'est pas obsolète conseils. En balançant les références sont toujours un problème, surtout si vous êtes, disons, de la mise en œuvre d'un tableau extensible conteneur (ArrayList ou similaire) à l'aide d'un pré-alloués tableau. Les éléments au-delà de la "logique" de la taille de la liste devrait être entaché de nullité, ou sinon ils ne seront pas libérés.

Voir Effective Java 2nd ed, Point 6: Éliminer Obsolètes les Références de l'Objet.

10voto

Thilo Points 108673

Champs d'Instance, les éléments du tableau

Si il y a une référence à un objet, il ne peut pas être nettoyée. Surtout si cet objet (et de tout le graphe derrière elle) est grand, il y a seulement un ouvrage de référence qui est l'arrêt de la collecte des ordures, et que la référence n'est pas vraiment besoin de plus, c'est une situation regrettable.

Des cas pathologiques, sont l'objet qui conserve une unnessary exemple à l'ensemble du DOM XML arbre qui a été utilisé pour le configurer, le MBean qui n'a pas été enregistré, ou de la seule référence à un objet à partir d'un non-déployée application web qui empêche tout un chargeur de classe déchargé.

Donc, sauf si vous êtes sûr que l'objet qui contient la référence elle-même sera nettoyée de toute façon (ou même à l'époque), vous devez null tout ce que vous n'avez plus besoin.

Portée des variables:

Si vous envisagez de définition d'une variable locale à null avant la fin de son champ d'application , de sorte qu'il peut être récupéré par le ramasse-miettes et de le marquer comme "inutilisable à partir de maintenant", vous devriez envisager de le mettre dans un champ plus restreint à la place.

{
  BigObject obj = ...
  doSomethingWith(obj);
  obj = null;          //   <-- explicitly set to null
  doSomethingElse();
}

devient

{
  {  
     BigObject obj = ...
     doSomethingWith(obj);
  }    //         <-- obj goes out of scope
  doSomethingElse();
}

Long, plat étendues sont généralement mauvais pour la lisibilité du code, trop. L'introduction de méthodes privées de casser des choses juste pour que le but n'est pas rare, trop.

5voto

besen Points 10430

En mémoire les environnements difficiles (par ex. téléphones portables) cela peut être utile. En définissant la valeur null, le objetc n'avez pas besoin d'attendre la variable à sortir du champ d'application de gc.

Pour le quotidien de programmation, cependant, cela ne devrait pas être la règle, sauf dans des cas particuliers, comme celui de Chris Bouffon des Jeunes de la cité.

1voto

Un objet ne peut pas être réclamé par le garbage collector alors qu'il y a encore toutes ses références, c'est à dire la valeur retournée par "nouveau que ce soit()" stocké n'importe où. Il est donc bon de s'assurer qu'aucun balançant des références linger (profond dans les structures de données, etc), afin d'éviter les fuites de mémoire. Ceci est habituellement fait de plusieurs manières:

  • La portée de la variable se termine - ce qui signifie que les variables à l'intérieur d'une méthode de "disparaître" lorsque la méthode est fait et toutes les références qui y sont stockés automatiquement en aller.
  • La classe contenant une variable de référence est le garbage collector. Par exemple une liste d'objets, contient beaucoup de références de l'objet, dont vous n'avez pas besoin de nettoyer manuellement. Vous pouvez simplement laisser l'objet de la liste d'être nettoyée et ne se soucient pas sur le contenu.
  • Définir explicitement une variable contenant une référence à null.

Réglage à la valeur null est la seule où le programmeur explicitement fait quelque chose. Habituellement, c'est à dire à QUELQU'un que l'objet n'est plus utilisé. La personne pourrait être

  • Garbage collector. Un très grand objet peut être pas le plus utilisé. Par micropression explicitement le garbage collector peut réutiliser cette zone sans avoir à attendre que la variable compris hors de portée. Comme un collolary ces zones de code peut être mis dans une nouvelle série de crochets de limiter la portée.
  • Responsable! Explicitement micropression une variable indique un lecteur humain que l'objet précédemment conservés dans il n'est plus utilisé et n'a pas à être mentalement traitées. Cela peut généralement être atteint mieux de refactoring dans une méthode supplémentaire, mais peut être nécessaire pour les variables globales qu'ils ne tombent pas hors de portée quand on quitte une méthode.

Donc, fondamentalement, il ya une raison pour explicitement micropression variables. L'écrivain original du code, il faut laisser un commentaire en expliquant POURQUOI il est fait, si il n'est pas explicitement écrit dans la convention de codage utilisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X