Pourquoi avoir des méthodes statiques privées?

68

Je voulais juste éclaircir une question que j'ai. Quel est l'intérêt d'avoir une méthode statique privée par opposition à une méthode normale avec visibilité privée?

J'aurais pensé qu'un avantage à avoir une méthode statique, c'est qu'elle peut être appelée sans instance de classe, mais étant donné que sa méthode privée a-t-elle le même sens d'être statique?

La seule raison pour laquelle je peux penser est que cela aide à comprendre conceptuellement la méthode au niveau classe par opposition au niveau objet.

Rehan Naqvi
la source
32
Oui, il y a une raison. Vos méthodes statiques public / default peuvent toujours appeler vos statiques privées. Si des méthodes statiques doivent être utilisées ou non, et lorsqu'il est approprié d'utiliser des méthodes privées, quelles qu'elles soient, sont des questions distinctes. Veillez donc à ne pas les mélanger à cette question.
2
Exemple rapide - méthode factory utilisée par une classe interne empêchant l'invocation par d'autres classes (vous devez utiliser la méthode factory pour obtenir une instance de la classe).
2
@ MattFenwick: vous devriez poster ceci comme réponse.
Doc Brown
9
En rendant une méthode statique, vous dites également qu'elle ne lit ni n'écrit dans les variables d'instance. Une méthode qui n'interagit pas avec les variables d'instance est souvent plus facile à déplacer et à refactoriser à d'autres endroits.
Mark Rogers
1
N'oubliez pas que, qu'une méthode statique soit privée, interne ou publique, elle n'est toujours pas thread-safe sans effort de synchronisation de code spécifique de votre part.
Craig

Réponses:

70

La caractéristique d'être statique est indépendante de la visibilité.

Les raisons pour lesquelles vous souhaiterez une méthode statique (un code qui ne dépend pas de membres non statiques) seront toujours utiles. Mais peut-être que vous ne voulez pas que quelqu'un / n'importe quoi d'autre l'utilise, juste votre classe.

Miyamoto Akira
la source
3
Je pense que vous êtes sur la bonne voie, mais je pense aussi qu'il vous manque un élément clé. La plupart des méthodes statiques n'ont aucun effet secondaire (ce sont en réalité des fonctions et non des méthodes) - c'est pourquoi elles ont été rendues statiques au départ. L'argument contre leur confidentialité est le suivant: "S'ils n'ont aucun effet secondaire, pourquoi ne pas les rendre publics pour promouvoir la réutilisation du code". C'est le point clé: lorsque nous le rendons privé, c'est généralement parce que nous voulons que vous réutilisiez la classe entière qui utilise cette méthode privée, pas seulement cette méthode.
CorsiKa
Je dois dire que je n'ai jamais fait cela ou vu ce comportement. Les quelques fois où je l'ai fait étaient pour des méthodes d'assistance à des classes statiques publiques.
Miyamoto Akira
1
@corsiKa: Les effets secondaires ne sont pas le problème. Rendre un membre statique d'une classe non privée promet effectivement que chaque version future d'une classe inclura la même méthode du même nom qui fera la même chose. Si les besoins changent et qu'une version future de la classe peut ne plus avoir besoin d'une méthode qui fonctionne exactement comme celle actuelle, une méthode privée peut être remplacée par une méthode qui répond mieux aux nouveaux besoins de la classe. Comme un exemple simple, supposons une classe a besoin d' une méthode qui prend une chaîne et exécute des substitutions comme <à &lt;, etc. Quand il est écrit ...
supercat
1
... les chaînes dont il est passé sont connus pour ne pas contenir de esperluette, et il n'y a donc pas convertir &à &amp;[j'étais en train d' écrire le code, je convertir &à &amp;même si je ne pensais pas qu'il soit nécessaire, mais supposons ce n'est pas]. Il devient plus tard nécessaire de gérer esperluette, mais la méthode est publique, changer d'étendre &à &amp;pourrait casser le code externe qui effectue sa propre &-à- &amp;substitution. Si la méthode est privée, cependant, elle pourrait être corrigée pour gérer &sans causer de problèmes pour tout code extérieur.
Supercat
C'est pour le moins un problème intéressant, mais je ne vois pas en quoi le fait d'être statique le rend plus problématique que de ne pas être statique, ce qui est la clé du problème. Si nous suivons votre logique, tout partout réimplémenterait tout parce que "omg, que se passe-t-il s'il y a un bogue ou si les exigences changent un jour?"
CorsiKa
26

Une raison assez courante (en Java) serait d’initialiser des variables de champ immuables dans un constructeur en utilisant une private staticméthode simple pour réduire l’encombrement du constructeur.

  • C’est private: les classes externes ne devraient pas le voir.
  • Il est static: il peut effectuer une opération indépendante 1 de l'état de la classe d'accueil.

Un exemple quelque peu artificiel suit ...

par exemple:

public class MyClass{
    private final String concatenated;

    public MyClass(String a, String b){
        concatenated = concat(a,b);
    }

    public String getConcatenated(){
       return concatenated;
    }

    /**
    *  Concatenates two Strings as `s1---s2`
    **/
    private static final String concat(String s1, String s2){
        return String.format("%s---%s", s1, s2);
    }
}

1 En supposant qu'il n'interagisse pas avec d'autres staticvariables.

Sheldon Warkentin
la source
15
Cela est d'autant plus utile lorsque vous devez transmettre des arguments dérivés (calculés) au constructeur d'une superclasse. L' super(...)appel doit être la première ligne du constructeur de votre classe. Vous ne pouvez donc pas déclarer de variables locales pour vous aider à déterminer ce qu'il convient de transmettre au super appel. Cependant, vous pouvez appeler des méthodes statiques (privées), qui utilisent autant de lignes que nécessaire pour déterminer la valeur à transmettre au super constructeur.
Andrzej Doyle
notez qu'il existe la possibilité d'un bloc d'initialisation statique
Franz Ebner le
13

Un cas d'utilisation courant pour une private staticméthode est une méthode utilitaire qui est

  1. seulement utilisé par cette classe
  2. est indépendant de l'état interne de cette classe
Philipp
la source
12

Vous voyez que vous avez quelques lignes de code qui sont répétées dans beaucoup de vos méthodes, vous décidez donc de les extraire en une seule méthode, car le code dupliqué n'est pas bon.

Vous rendez la méthode privée car elle n'est pas conçue pour une utilisation généralisée et vous ne voulez pas que du code non lié l'appelle. (Débattez ce point dans les commentaires….)

Comme la méthode n’accède à aucun champ d’instance, elle peut être rendue statique. En la rendant statique, vous la rendre plus facile à comprendre et peut-être même un peu plus rapidement.

Puis .... (Peut-être maintenant, peut-être plus tard, peut-être jamais)

Une fois que la méthode est devenue statique, il est clair qu’elle peut être déplacée hors de la classe, par exemple dans une classe unitaire.

Il est également facile de le transformer en une méthode d’instance d’un de ses paramètres, c’est souvent là que le code devrait être.

Ian
la source
J'aime cette réponse, mais avez-vous une référence à jour pour cela? "et peut-être même un peu plus vite"
Magnilex
@Magnilex, le pointeur "this" n'est pas transmis aux méthodes de classe statiques. Par conséquent, elles auront tendance à être plus rapide que les méthodes d'instance statique, à moins que le compilateur détecte que "ce" n'est pas utilisé dans la méthode d'instance (improbable).
Ian
2

Je peux penser à au moins deux raisons pour lesquelles vous auriez besoin d'une méthode privée statique sur une classe.

1: Vos instances ont des raisons d'appeler une méthode statique que vous ne voulez pas appeler directement, peut-être parce qu'elle partage des données entre toutes les instances de votre classe.

2: Vos méthodes statiques publiques ont des sous-programmes que vous ne voulez pas appeler directement. La méthode est toujours appelée sans instance, mais pas directement.

Bien sûr, "cela aide la classe à comprendre" est une bonne raison en soi.

DougM
la source
1

Généralement, si je découvre que j'écris des méthodes statiques privées, je le prends comme une indication qu'il y aurait quelque chose que j'aurais dû modéliser séparément.

Comme elles ne sont pas liées à l'état d'une instance d'objet particulière, une collection de méthodes statiques privées et publiques peut former une classe entièrement séparée avec sa propre sémantique et ses méthodes non statiques.

(Un autre conseil est que, si j'ai plusieurs méthodes statiques (publiques et privées) qui ont toutes un paramètre commun, elles pourraient être meilleures en tant que membres de ce type.)

Ainsi, pour répondre à votre question, des méthodes statiques privées apparaissent lorsqu'une classe fournit un groupe de méthodes liées indépendantes d'une instance de cette classe. (... et puisqu'ils sont indépendants, ils seront peut-être mieux dans leur propre classe.)

Rob
la source
-1

Voici un exemple très simple, si vous souhaitez effectuer un traitement sur des arguments d'entrée (ou une manipulation) qui sont passés à la fonction principale. Donc, dans ce cas, si le traitement est volumineux et que les mêmes fonctionnalités ne seront utilisées nulle part ailleurs, il sera logique d’avoir une fonction privée, car elle ne sera pas utilisée / appelée de nulle part ailleurs + static car main est statique.

techExplorer
la source