web-dev-qa-db-fra.com

Utilisation de méthodes statiques privées

Que pensez-vous de l'utilisation de méthodes statiques privées?

Personnellement, je préfère utiliser une méthode privée statique à non statique comme tant qu'il ne nécessite pas d'accès à des champs d'instance.

Mais j'ai entendu dire que cette pratique violait les principes OOP.

Edit: je me demande du point de vue du style de vue, pas de la performance.

36
Andrey Vityuk

UNE private static la méthode en elle-même ne viole pas OOP en soi, mais quand vous avez beaucoup de ces méthodes sur une classe qui n'ont pas besoin (et ne peuvent pas *) d'accéder aux champs d'instance, vous n'êtes pas la programmation d'une manière OO, car "objet" implique état + opérations sur cet état défini ensemble. Pourquoi mettez-vous ces méthodes sur cette classe, si elles n'ont besoin d'aucun état?

(*) = En principe, en raison de la visibilité au niveau de la classe en Java, une méthode statique sur une classe a accès aux champs d'instance d'un objet de cette classe, par exemple:

class Test
{
  int field = 123;

  private static void accessInstance(Test test)
  {
    System.out.println(test.field);
  }
}

Vous devez passer la référence à une instance (this pointeur) vous-même bien sûr, mais vous imitez essentiellement les méthodes d'instance. Il suffit de mentionner cela pour être complet.

39
eljenso

Comme mentionné ci-dessus, les méthodes statiques privées sont souvent utiles pour organiser la logique réutilisée et réduire/éliminer le code répété. Je suis surpris de n'avoir remarqué aucune mention de performance dans cette discussion. Extrait de 'The Final Word on Final' de Renaud Waldura:

(Remarque: les méthodes statiques privées sont implicitement définitives)

"Puisqu'une méthode finale n'est implémentée que dans la classe déclarante, il n'est pas nécessaire de distribuer dynamiquement un appel à une méthode finale, et l'invocation statique peut être utilisée à la place. Le compilateur peut émettre un appel direct à la méthode, en contournant entièrement la procédure habituelle procédure d'invocation de méthode virtuelle. Pour cette raison, les méthodes finales peuvent également être intégrées par un compilateur Just-In-Time ou un outil d'optimisation similaire. (N'oubliez pas que les méthodes privées/statiques sont déjà finales, donc toujours prises en compte pour cette optimisation.) "

Consultez l'intégralité du document: http://renaud.waldura.com/doc/Java/final-keyword.shtml

21
tyler

privé ou public ne fait aucune différence - les méthodes statiques sont OK, mais si vous trouvez que vous les utilisez tout le temps (et bien sûr les méthodes d'instance qui n'accèdent à aucun champ d'instance sont fondamentalement des méthodes statiques à cet effet), alors vous devrez probablement repenser la conception. Ce n'est pas toujours possible, mais la plupart du temps les méthodes doivent résider avec les données sur lesquelles elles opèrent - c'est l'idée de base de la POO.

4
Michael Borgwardt

Je ne vois pas nécessairement de réel problème avec ce que vous faites, mais ma première question serait si la méthode ne nécessite pas d'accès à des champs d'instance, alors que fait-elle dans cette classe en premier lieu?

2
Eric Petroelje

C'est une question de goût, mais je fais des méthodes qui ne réagissent pas à un état statique de l'objet. De cette façon, je n'ai pas à réécrire le code si une fonction statique a besoin de fonctionnalités similaires. Une fonction de tri serait un bon exemple d'un tel cas.

0
soulmerge

J'ai tendance à ne pas utiliser de méthodes statiques privées. J'utilise des méthodes statiques publiques et les regroupe en classes Util pour promouvoir la réutilisation.

0
digitalsanctum

Les méthodes statiques privées peuvent par exemple fonctionner sur des membres statiques privés de leur classe. Cela peut être utilisé pour encapsuler et unifier certaines opérations spécifiques à une classe.

L'inconvénient majeur de l'utilisation de méthodes statiques est à mon avis le fait qu'on jette la possibilité de passer outre. Puisque les classes de Java ne sont pas comme, disons, les classes de Smalltalk, vous ne pouvez pas remplacer les méthodes statiques.

Étant donné que votre question concerne les méthodes statiques privées, la substitution est de toute façon impossible.

J'ai tendance à utiliser des méthodes statiques uniquement dans le cas de classes utilitaires (comme Java.lang.Math) ou de modèles comme le modèle Singleton. Tous ces éléments nécessitent une visibilité plus élevée que le privé, car ils représentent les services fournis par leur classe à d'autres.

Réflexion finale: si vous avez une ou plusieurs méthodes statiques privées, pensez à les extraire vers une classe utilitaire dédiée et à les rendre publiques. Encore mieux, faites-leur des méthodes d'instance et utilisez le modèle Singleton.

0
Lars