Quel est le meilleur moyen de nettoyer un objet en Java?
Nous n'avons pas de destructeur en Java qu'en C++.
T1. Comment doit-on nettoyer un Objet en java.
T2. Est-il une alternative à un bloc finally.
T3. Parfois, nous devons faire appel explicitement d'initialisation et de terminaison d'un tiers le code de notre classe par exemple
public classs MyClass{
public MyClass(){
ThirdPartyInitialize();
}
protected void finalize(){
ThirdPartyTerminate();
}
}
Est-ce la bonne manière?
source d'informationauteur pankajt
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez généralement pas "nettoyer" la Java des objets vous-même. Le garbage collector décide de nettoyer les objets en place. Vous pouvez indiquer lorsque vous avez terminé avec un objet de référence par la valeur
null
mais en général, juste le laisser aller hors de la portée est assez bon. De toute façon, vous n'avez pas de contrôle sur le moment où il reçoit les ordures collectées.La
finally
bloc est prévu pour l'exécution des actions de savoir si une exception est générée à partir d'untry
bloquer ou pas, et est le meilleur endroit pour effectuer le nettoyage. Généralement, vous ne serait nettoyer non-objet les ressources telles que l'ouverture des ruisseaux.finalize()
n'est pas garanti d'être appelé parce que le garbage collector n'est pas garanti d'être appelée avant que votre programme se termine. Il n'est pas vraiment comme un destructeur C++ parce que le C++ destructeurs sont toujours appelés et vous pouvez compter sur eux d'être appelé. Vous ne pouvez pas compter surfinalize()
appelé.Donc 1) utilisation
finally
blocs pour libérer non-objet les ressources 2) que le garbage collector nettoyer objet-ressources 3) vous pouvez indice pour le garbage collector qui vous sont faites avec un objet en paramètre ànull
si elle est utilisée dans une méthode longue.Vous pouvez également ajouter une fermeture à crochet à votre programme, si votre programme est en cours d'arrêt trop:
Le meilleur moyen de nettoyer les objets sont simplement déposer l'objet.
Enfin les blocs peuvent être extraites à l'aide de l'Exécuter Autour de l'idiome.
Finalisers doit être évitée. Ils ont probablement wont être appelé immédiatement. Le nettoyage doit se passer de toute façon. Ils sont relativement lents. Vous pouvez ajouter l'un comme un filet de sécurité si vous êtes à la rédaction d'un faible niveau de ressources (wrapper pour, disons, un descripteur de fichier) si la performance n'est pas critique.
Voici un bon aperçu sur les finaliseurs.
Vous pouvez nettoyer les objets en supprimant les références aux, lorsque vous n'en avez plus besoin. Vous n'avez pas à le faire explicitement. Explicite de nettoyage demanderait de mettre la référence à null, ce qui fournit une indication sur le garbage collector que l'objet peut être recueilli. Cette astuce fonctionne parce que de l'intérieur le nombre de références pour chaque objet, qui sont maintenus en interne.
Par exemple
Il existe de meilleures alternatives pour finaliser() en fonction de combien finalize() est d'aider votre situation.
Souvent, la meilleure pratique est de fournir une méthode close() ou disposeResources() de l'API qui va permettre à l'appelant de l'aide de l'API de nettoyer lui-même. Par exemple, le java.sql.La classe de connexion ne ce. C'est mieux que la méthode finalize (), depuis la JVM va appeler la méthode finalize (). Souvent la méthode finalize() sera exécuté par un thread de priorité faible dans la JVM, conduisant à certaines des erreurs étranges.
Dans le cas de la Connexion de la classe, dans l'attente de la JVM pour effectuer la finalisation de ne se révéler coûteux dans un grand nombre d'applications, depuis une base de données peut accepter que les connexions à la fois. Par conséquent, la plupart des programmeurs vont appeler close() explicitement sur un objet de Connexion.
Dans votre cas, il devrait se traduire par quelque chose de semblable (et, dans ce contexte, le bloc finally est assuré pour toujours)
Ceci est similaire à la façon dont la classe de Connexion est également utilisé dans la plupart des situations.
Deux syntaxe de sucre options:
1) Il y a un @Nettoyage annotation à Lombok qui la plupart du temps ressemble à C++ destructeurs (plus):
2) Il est également try-with-resources déclaration. Par exemple:
Vous pouvez utiliser java.lang.réf.Nettoyeur en Java 9,
Le finaliser est utilisé semblable à un destructeur, mais, si vous utilisez le bloc try...finally pour les ressources alors vous pouvez ouvrir une ressource dans le bloc finally vous fermez la ressource.
Le bloc finally est toujours appelé, lorsque le bloc est terminé, soit normalement ou par le biais d'une exception levée.
Finaliser est risqué pour la gestion des ressources, que vous ne savez pas quand il sera appelé, et s'il ferme un objet qui a également finaliser alors il peut prendre un certain temps.
Le bloc finally est la meilleure approche.
Vos objets en Java n'a jamais vraiment besoin d'être "Nettoyé", GC fonctionne, tout Simplement. Presque chaque fois que j'ai vu someObject=null dans le code, c'est quelqu'un qui ne savait pas ce qu'ils faisaient. Il y a un cas théorique, mais c'est vraiment un cas limite et généralement mieux traités dans d'autres façons, comme l'a récemment ajouté essayer avec des ressources.
Si vous avez une ressource externe qui doit être nettoyé lorsqu'un objet n'est plus utilisé, c'est une autre question.
Il y a "de Référence" de classes qui détiennent un type spécial de Référence à votre classe--il ne s'arrêtera pas de collecte des ordures, mais il peut vous avertir lorsque la classe est le garbage collector (Par le biais d'un rappel si vous le souhaitez). Rechercher WeakReference, PhantomReference, etc.
Ce sont fiables et fonctionnent en un beaucoup plus déterministe moyen que d'une réelle "finaliser" de la méthode, car le rappel est à l'extérieur de votre classe, de sorte que vous ne finissent pas l'exécution d'une méthode de pré-supprimé la moitié ou de l'état supprimé et les problèmes qui pourraient causer.