2010-06-09 10 views
6

Un de mes collègues définit la référence à null dans des blocs finally. Je pense que c'est un non-sens.Définir la référence = null dans le bloc finally?

public Something getSomething() { 
    JDBCConnection jdbc=null; 
    try { 
     jdbc=JDBCManager.getConnection(JDBCTypes.MYSQL); 
     ... 
    } 
    finally { 
     JDBCManager.free(jdbc); 
     jdbc=null; // <-- Useful or not? 
    } 
} 

Qu'en pensez-vous?

+0

Pour ce code * exact *, il ne sert à rien d'essayer/finalement non plus - si une exception est levée par getConnection, jdbc est null, donc free ne fera rien. Vraisemblablement, il y a vraiment quelque chose entre la mission et la fin de l'essai. –

+0

Qu'est-ce que vos collègues raisonnent pour le faire? –

+0

Je pense, il le considère comme "propre" et économisera de la mémoire. – deamon

Répondre

11

Vous avez raison, jdbc est une variable locale alors quand la méthode getSomething() retourne jdbc sera hors de portée et admissible à la collecte des ordures qui est effectivement la même chose que lui à null. Il est donc inutile de définir une variable sur null lorsqu'elle est hors de portée dans la ligne de code suivante.

Il est recommandé de limiter les variables à la plus petite portée requise, par ex. Si vous avez seulement besoin d'une variable dans une boucle for, déclarez-la dans la boucle for et elle sera éligible pour la récupération de place lorsque le code quitte la boucle for. Ceci, en plus de réduire la complexité de vos méthodes, réduit le besoin de définir des variables locales sur null et, avantage, votre code devient plus modulaire, plus facile à lire et à maintenir.

2

Oui, c'est un non-sens. La motivation est habituellement d '«aider» le garbage collector, mais ce n'est pas vraiment une aide car la référence est effacée de toute façon. Même si cela ne fait pas de mal non plus, du moins pas pour le VM - vos yeux et votre santé mentale sont différents.

Toutefois, l'exemple ne renvoie pas quelque chose. Si l'exemple est incomplet, et qu'il existe en fait des instructions après le bloc finally, la définition de jdbc à null peut avoir un effet dissuasif à utiliser, et le NPE qui se produirait informe immédiatement de toute utilisation après le bloc finally.

5

Puisqu'il s'agit d'une variable locale, elle sera quand même hors de portée. C'est n'importe quoi.

S'il s'agissait d'une variable d'instance (variable membre) d'un objet à longue durée de vie, cela pourrait être utile car cela pourrait empêcher le garbage collector de disposer l'objet.

-2

S'il y avait plus de code après le bloc finally au lieu de simplement terminer la méthode, cela pourrait aider le garbage collector à le nettoyer.

+0

Plus à cela - cela empêcherait les programmeurs d'utiliser jdbc après qu'il ait été libéré. –

+1

Non, cela ne va pas aider le GC à nettoyer. La spécification JVM est assez claire que seules les références qui contribuent à d'autres calculs sont accessibles, donc si vous l'annulez et que vous n'obtenez pas de NPE, alors l'annuler n'a aucun effet. Si vous l'annulez et obtiendrez un NPE, vous avez brisé le code. Il est plus facile de mettre un {} supplémentaire autour de la déclaration et de l'utiliser, ou mieux de refactoriser son utilisation à une méthode séparée, pour savoir si elle est utilisée au moment de la compilation. –

+0

jdbc est déjà nul. –

1

Dans ce cas particulier, techniquement parlé, c'est vraiment inutile. Lorsque la méthode retourne, jdbc n'existe plus et ne contiendra pas de référence à une connexion, cela n'affectera donc pas la récupération de place.

C'est une question de style de codage. Il y a un petit avantage si un jour vous ajoutez plus de code après le bloc finally. Ensuite, il est immédiatement évident que vous ne pouvez plus utiliser jdbc car il a été libéré par JDBCManager.

Alors oui, il est recommandé d'annuler les références aux ressources éliminées.

+0

+1 pour montrer au _programmer_ qu'une référence donnée est invalide. –

+0

qui a downvoted cette réponse - je serais heureux de connaître votre raison. Vraiment! –

1

comme déjà écrit, dans ce cas, il est inutile, car la méthode se termine après la finale.
Je le ferais, s'il y a du code après le try-finally, pour finalement empêcher son utilisation. Et il y a des situations (très rares) où cela peut aider.
Jetez un oeil à cet article: Java Memory Puzzle

0

puis il devrait mettre toutes les variables locales à zéro dans toutes les méthodes avant le retour. JVM optimisera probablement la ligne de toute façon, de sorte qu'il n'a aucun effet d'exécution du tout.

Questions connexes