Est-ce une mauvaise pratique pour une classe de n’avoir que des champs et des méthodes statiques?

J’ai une classe constituée uniquement de variables membres statiques et de méthodes statiques. Essentiellement, il sert de classe d’utilité générale.

Est-ce une mauvaise pratique pour une classe de ne contenir que des variables membres statiques et des méthodes statiques?

Non, je ne pense pas du tout. Il est pire d’avoir une classe pleine de méthodes d’instance qui ne dépendent pas réellement d’une instance particulière. Les rendre statiques indique à l’utilisateur comment ils doivent être utilisés. De plus, vous évitez les instanciations inutiles de cette manière.

EDIT: Après coup, en général, je pense que c’est bien d’éviter d’utiliser les fonctionnalités de langage “juste parce que”, ou parce que vous pensez que c’est la “manière de faire de Java”. Je me souviens de mon premier travail où j’avais un cours complet de méthodes utilitaires statiques et l’un des programmeurs seniors m’a dit que je ne tirais pas pleinement parti de la puissance OO de Java en rendant toutes mes méthodes “globales”. Elle n’était pas dans l’équipe six mois plus tard.

Tant que la classe n’a pas d’état interne et est essentiellement ce qu’on appelle une classe de feuilles (les classes d’utilité entrent dans cette catégorie), en d’autres termes, elle est indépendante des autres classes. C’est bon.

La classe Math étant un exemple parfait.

Semble raisonnable.

Remarque: Les classes qui le font ont souvent un constructeur privé sans arg pour que le compilateur génère une erreur si un programmeur tente de créer une instance de la classe statique.

Les méthodes statiques ne me préoccupent pas beaucoup (sauf pour les tests).

En général, les membres statiques sont une préoccupation. Par exemple, que se passe-t-il si votre application est en cluster? Qu’en est-il du temps de démarrage – quel type d’initialisation a lieu? Pour un examen de ces questions et plus encore, consultez cet article de Gilad Bracha.

C’est parfaitement raisonnable. En fait, en C #, vous pouvez définir une classe avec le mot-clé static spécifiquement à cet effet.

Ne t’emballe pas avec ça. Notez que la classe java.lang.Math ne concerne que les fonctions mathématiques. Vous pouvez également avoir une classe SsortingngUtilities qui contient des fonctions courantes de gestion de chaînes qui ne figurent pas dans l’API standard, par exemple. Mais si votre classe s’appelle Utilitaires, par exemple, vous pouvez diviser cette information.

Notez également que Java a spécifiquement introduit l’importation statique: ( http://en.wikipedia.org/wiki/Static_import )

L’importation statique est une fonctionnalité introduite dans le langage de programmation Java que les membres (champs et méthodes) définis dans une classe comme étant publics statiques doivent être utilisés dans le code Java sans spécifier la classe dans laquelle le champ est défini. Cette fonctionnalité a été introduite dans la langue dans la version 5.0.

La fonctionnalité fournit un mécanisme type pour inclure des constantes dans le code sans avoir à référencer la classe qui a défini le champ à l’origine. Cela permet également de déconseiller la création d’une interface constante: une interface qui définit uniquement les constantes puis écrit une classe implémentant cette interface, ce qui est considéré comme une utilisation inappropriée des interfaces [1].

Le mécanisme peut être utilisé pour référencer des membres individuels d’une classe:

  import static java.lang.Math.PI; import static java.lang.Math.pow; 

ou tous les membres statiques d’une classe:

  import static java.lang.Math.*; 

Bien que je sois d’accord avec le sentiment que cela semble être une solution raisonnable (comme d’autres l’ont déjà dit), une chose que vous voudrez peut-être prendre en compte est, du sharepoint vue de la conception, pourquoi Ces fonctionnalités sont-elles vraiment générales dans tout le système ou sont-elles réellement liées à une classe spécifique d’objects de votre architecture?

Tant que vous y avez réfléchi, je ne vois aucun problème avec votre solution.

La classe Collections dans le SDK Java a uniquement des membres statiques.

Donc, voilà, tant que vous avez une justification appropriée – ce n’est pas une mauvaise conception

Les méthodes utilitaires sont souvent placées dans des classes contenant uniquement des méthodes statiques (telles que SsortingngUtils ). Les constantes globales sont également placées dans leur propre classe afin qu’elles puissent être imscopes par le rest du code (atsortingbuts public final static ).

Les deux utilisations sont assez courantes et ont des constructeurs privés par défaut pour les empêcher d’être instanciés. Déclarer la classe finale empêche l’erreur d’essayer de remplacer les méthodes statiques.

Si, par static member variables vous ne voulez pas dire des constantes globales, vous pouvez placer les méthodes accédant à ces variables dans une classe à part. Dans ce cas, pourriez-vous expliquer ce que ces variables font dans votre code?

C’est généralement ainsi que les classes d’utilitaires sont conçues et qu’il n’y a rien de mal à cela. Des exemples célèbres incluent oaclSsortingngUtils , oacdDbUtils , oswbServletRequestUtils , etc.

Selon une interprétation rigide de la conception orientée object, une classe d’utilité est quelque chose à éviter.

Le problème est que si vous suivez une interprétation rigide, vous devrez alors forcer votre classe dans un object de sorting afin d’accomplir beaucoup de choses.

Même les concepteurs Java créent des classes utilitaires (java.lang.Math en tête)

Vos options sont les suivantes:

 double distance = Math.sqrt(x*x + y*y); //using static utility class 

contre:

 RootCalculator mySquareRooter = new SquareRootCalculator(); mySquareRooter.setValueToRoot(x*x + y*y); double distance; try{ distance = mySquareRooter.getRoot(); } catch InvalidParameterException ......yadda yadda yadda. 

Même si nous devions éviter la méthode verbeuse, nous pourrions toujours nous retrouver avec:

 Mathemetician myMathD00d = new Mathemetician() double distance = myMathD00d.sqrt(...); 

dans ce cas, .sqrt () est toujours statique, alors quel serait l’intérêt de créer l’object en premier lieu?

La réponse est, créez des classes d’utilitaires lorsque votre autre option serait de créer une sorte de classe “Worker” artificielle, peu ou pas utilisée pour les variables d’instance.

Ce lien http://java.dzone.com/articles/why-static-bad-and-how-avoid semble aller à l’encontre de la plupart des réponses ici. Même si elle ne contient aucune variable membre (c’est-à-dire sans état), une classe statique peut toujours être une mauvaise idée car elle ne peut être ni moquée ni étendue (sous-classée), ce qui va à l’encontre de certains principes d’OO.

Je ne serais pas préoccupé par une classe d’utilitaire contenant des méthodes statiques.

Cependant, les membres statiques sont essentiellement des données globales et doivent être évités. Elles peuvent être acceptables si elles sont utilisées pour mettre en cache les résultats des méthodes statiques et autres, mais si elles sont utilisées comme des “vraies” données pouvant entraîner toutes sortes de problèmes, telles que des dépendances cachées et des difficultés pour configurer des tests.