Avez-vous déjà eu besoin de détruire une instance singleton?
À l'aide d'un singleton, un seul exemple de ce qui peut être créé. Nous ne devons détruire cette instance?
J'ai un singleton DBManager, qui gère une connexion JDBC et les opérations de requête. Par l'appel de sa statique de la méthode newInstance, je peux obtenir de l'instance, alors je ne certaines requêtes. Enfin, je veux fermer la connexion de Base de données, et j'appelle une autre méthode statique fermer pour fermer la connexion JDBC.
Maintenant la connexion a été fermée, tandis que l'instance de DBManager est encore en vie, mais pas utile. Ai-je besoin de le détruire, par exemple, en l'assignant à null? Sinon, il peut être référencé par erreur plus tard.
Si j'attribue cette instance null, puis appel de méthode newInstance encore une fois, vais-je avoir une autre nouvelle instance à l'autre?
source d'informationauteur chance
Vous devez vous connecter pour publier un commentaire.
Je n'aurais pas accroché sur la sémantique de la “singleton”—votre exigence est qu'au plus une instance de
DBManager
existent à tout moment. Une fois que l'instance est rendue inutile, vous pouvez le détruire donc une nouvelle instance sera créée à la demande, ou bien définir votrenewInstance
méthode (qui je pourrais suggérer être renommégetInstance
) lève une exception (peut-êtreIllegalStateException
) si elle est appelée après que le singleton a été rendue inutile.Si vous voulez détruire lors du rendu inutile, je suggère que ce soit fait à l'intérieur de la classe singleton automatiquement, sans aide extérieure. Vous devriez également considérer masquant complètement le singleton
DBManager
et la mise en œuvre d'une délégation de modèle à la place. Cela permettra d'éviter le problème d'un client de garder une référence à la rassisDBManager
instance. Vous pouvez ensuite faire l'objet delegate régulière d'un singleton.Je dirais que pason ne peut pas détruire un singleton, car il doit y avoir exactement une instance de la disposition en tout temps. Et sans doute qu'il doit être le même exemple, parce que sinon c'est pas vraiment un singleton (par exemple, deux classes différentes pourraient contenir des références à différentes instances de la classe).
Mais d'ailleurs, c'est l'une des nombreuses raisons pour lesquelles je crois que le pattern singleton a peu ou pas d'utilisation en situation réelle de logiciel. Les chances de vous en vouloir exactement une chose, toujours, en toutes circonstances, à l'endroit où vous appliquer cela en empêchant les gens d'appeler les constructeurs - est tout simplement trop rigide. Cela sonne comme une situation où, à un moment donné, il semblait raisonnable d'avoir un singleton, mais il est maintenant devenu évident que plusieurs instances de sens.
Donc si ce doit être un singleton - pouvez-vous simplement faire un wrapper autour de la connexion câblée possible?
Je pense qu'il serait plus en accord avec le pattern Singleton pour faire de la DBManager capable de l'ouverture et de la fermeture de la connexion sans détruire la DBManager lui-même. Vous pourrez alors la garder jusqu'à la prochaine fois vous avez besoin d'une connexion de base de données, et de poser la même DBManager objet de créer la nouvelle connexion. Après tout, si c'est un DBManager, il gère les connexions; il ne représente aucune connexion individuelle.
Dans de tels cas, nous nous servons de la Connexion mécanisme de mise en commun. Chacune de vos opérations de requête de la base de données doit ouvrir et fermer la connexion. Cependant, parce que nous nous efforçons de rendre l'utilisation du Pool de Connexion, la connexion est retourné à la piscine au lieu d'aller physiquement fermé.
Il y aura un réglage sur la piscine appelée
IDLE_CONNECTION_TIMEOUT
ou similaires qui expirera automatiquement et fermer les connexions s'ils sont inutilisés pour la configuration de la période de temps. Donc, peu de choses pour les développeurs à s'inquiéter dans de tels cas.Réponse courte: Non.
Plus réponse: Vous ne pouvez pas détruire un singleton, sauf que vous utilisez un chargeur de classe. Si vous avez besoin de les détruire, vous ne devriez pas utiliser un singleton. Peut-être que vous pouvez réécrire de façon à en rouvrir - mieux: éviter le pattern singleton.
De recherche pour la lutte anti motif, ou de l'odeur de code.
La réponse devrait être pas on ne peut pas détruire un singleton comme il devrait y avoir un et un seul. Quant à votre problème, vous avez un DBManager classe, qui HASA connexion est fermée et de devenir inutile.
Je devine votre objectif devrait être d'avoir une connexion DB ouvertes à tout moment, si je regarde votre code ici, êtes-vous de briser la seule responsabilité du principal et de vous assurer de la scission de la Connexion de la responsabilité dans une classe à part et de permettre à votre seule le privilège de la gestion de ses connexions à - dire de la fermeture et de la réouverture tant que de besoin.
Votre DBManager classe doit gérer le nettoyage si le db connexion est fermée. j'.e si DBManager a un referrence à la classe de Connexion , vous pouvez écrire un code dans la méthode newInstance() pour vérifier si la connexion est vivant, puis retour statique de Référence. quelque chose comme ceci:
Créer un getter/setter pour la Variable de classe et de définir yo null ré-instancier un objet
Ex: