J'ai une classe pleine de fonctions utilitaires. L'instanciation d'une instance de celui-ci n'a pas de sens sémantique, mais je veux toujours appeler ses méthodes. Quelle est la meilleure façon de gérer cela? Classe statique? Abstrait?
Réponses
Trop de publicités?Selon le grand livre "Effective Java":
Article 4: Appliquer noninstantiability avec un constructeur privé
- Tenter de faire valoir noninstantiability en faisant une classe abstraite ne fonctionne pas.
- Un constructeur par défaut est généré uniquement si une classe contient pas explicitement les constructeurs, donc une classe peut être faite noninstantiable en incluant un constructeur privé:
// Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
Parce que l'explicite le constructeur est privé, il est inaccessible à l'extérieur de la classe. Le AssertionError n'est pas strictement nécessaire, mais elle fournit de l'assurance dans le cas où le constructeur est accidentellement appelé à partir à l'intérieur de la classe. Il garantit que la classe ne sera jamais instanciée sous aucun prétexte. Cet idiome est légèrement paradoxal, que le constructeur a prévu expressément, de sorte qu'il ne peut pas être invoquée. Il est donc sage d'inclure un commentaire, comme indiqué ci-dessus.
En effet, cet idiome empêche également la classe d'être sous-classé. Tous les constructeurs doivent appeler un constructeur de la superclasse, explicitement ou implicitement, et une sous-classe aurait pas accessible constructeur de la superclasse à invoquer.
On dirait que vous avez une classe d'utilitaire similaire à java.lang.Math .
L'approche est la classe finale avec constructeur privé et méthodes statiques.
Mais méfiez-vous de ce que cela fait pour la testabilité, je vous recommande de lire cet article
Les méthodes statiques sont mortelles à la testabilité
Juste pour nager en amont, les membres statiques et les classes ne participent pas à OO et sont donc mauvais. Non, pas mal, mais sérieusement, je recommanderais une classe régulière avec un modèle singleton pour l'accès. De cette façon, si vous avez besoin de remplacer le comportement dans tous les cas, ce n'est pas un réoutillage majeur. OO est ton ami :-)
Mon $ .02
commentaire sur les arguments "constructeur privé": allez, les développeurs ne sont pas si stupides; mais ils sont paresseux. créer un objet puis appeler des méthodes statiques? ça n'arrivera pas
Ne passez pas trop de temps pour vous assurer que votre classe ne peut pas être mal utilisée. Ayez confiance en vos collègues. et il y a toujours un moyen d'abuser de votre classe, peu importe comment vous la protégez. la seule chose qui ne peut pas être mal utilisée est une chose complètement inutile.