132 votes

Java: classe statique?

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?

166voto

David Robles Points 4312

Constructeur privé et méthodes statiques sur une classe marquée comme finale.

93voto

David Robles Points 4312

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.

21voto

crowne Points 6002

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é

6voto

Bennett Dill Points 1552

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

3voto

irreputable Points 25577

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X