Eviter d'instancier une classe en Java
Récemment j'ai été confronté à une question : Comment éviter l'instanciation d'une classe Java?
Cependant, j'ai répondu en disant:
- Si vous ne voulez pas instancier une classe, utilisez "abstrait" modificateur. Ex: javax.servlet.HttpServlet, est déclarée abstraite(même si aucun de ses méthodes sont abstraites) pour éviter de l'instanciation.
- Déclarer aucun argument constructeur privé.
Maintenant, ma question est
a) existe-t-il d'autres moyens?
b) pourquoi est-ce une quelconque ne voulez pas instancier une classe? - après avoir cherché dans l'affirmative, j'ai fait la connaissance de cette que Util classes peuvent être prise de ne pas instancier. Tous les autres lieux où nous ne voulons pas instancier une classe en POO?
source d'informationauteur HanuAthena
Vous devez vous connecter pour publier un commentaire.
Quatre raisons viennent à l'esprit:
Comme un exemple de (2), vous souhaitez peut-être créer canonique des objets. Par exemple, les combinaisons de couleurs RVB. Vous ne voulez pas de créer plus d'une instance de n'importe quel RVB combo si vous faites cela:
Remarque: non non-arg constructeur est nécessaire parce qu'un autre constructeur est défini de façon explicite.
Pas vraiment une réponse à votre question, mais juste une remarque:
Lorsque vous effectuez un privé non-arg constructeur pour empêcher l'instanciation de votre utilitaire de classes, vous devriez avoir le constructeur lève une exception (par exemple, UnsupportedOperationException). C'est parce que vous pouvez réellement accès privé (y compris les constructeurs) par la réflexion. Notez que si vous le faites, vous devez l'accompagner d'un commentaire, parce que c'est un peu contre-intuitive qui vous définir un constructeur de empêcher une classe d'être instancié.
Faire l'utilité de la classe abstraite n'est pas une bonne idée car il fait de la classe regardez comme il est destiné à être étendu, et en outre, vous pouvez étendre la classe, ce qui l'instancier.
Parfois vous voulez éviter que d'autres l'instanciation de vos objets, afin d'avoir un contrôle complet sur toutes les instances existantes. Un exemple est la le pattern singleton.
Je pense que la raison la plus courante pour ne pas vouloir d'instancier une classe, c'est quand vous avez affaire à une classe statique, et donc avec ses méthodes statiques. Vous ne voulez pas que quelqu'un essaie d'instancier cette classe. De même, lorsque vous traitez avec des classes de Fabrique ou, dans certains cas, de nombreuses classes singleton permet de masquer leur constructeur pour ne pas être instancié dans la voie normale.
Une autre façon de faire une classe non-instanciable serait de le déclarer comme un privé intérieur de la classe, et puis pas de moyen de l'instancier dans les environs de la classe. Mais c'est (OMI) assez inutile.
Vous voulez qu'une classe non-instanciable si elle n'a pas de sens pour l'instancier. Vous pouvez généralement le faire que si la classe est vraiment juste une collection de (statique) des méthodes d'assistance, ou si la classe est "incomplète". L'incomplétude peut être syntaxiquement évident (c'est à dire des méthodes abstraites), mais il y a d'autres types d'incomplétude. Par exemple, vous pouvez fournir par défaut des implémentations par défaut pour toutes les méthodes, et nécessitent une ou plusieurs d'entre eux à être remplacée pour la classe de faire quelque chose d'utile.
Une autre raison de faire une classe non-instanciable (ou au moins, pas directement instanciable) si les besoins de votre application pour le contrôle de l'instanciation. Par exemple, java.util.regex.Modèle de classe ne peut pas être directement instancié, de sorte que le JRE peut (pourrait) maintenir un cache de pré-compilé regexes.