Je voulais juste clarifier 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 d'avoir une méthode statique est qu'elle peut être appelée sans instance d'une classe, mais puisque son caractère privé est-il même utile qu'elle soit statique?
La seule raison pour laquelle je peux penser est que cela aide à comprendre conceptuellement la méthode au niveau de la classe par opposition au niveau de l'objet.
La caractéristique d'être statique est indépendante de la visibilité.
Les raisons pour lesquelles vous souhaiterez avoir une méthode statique (du code qui ne dépend pas de membres non statiques) seront toujours utiles. Mais peut-être que vous ne voulez pas que quelqu'un/quoi que ce soit d'autre l'utilise, juste votre classe.
Une raison assez courante (en Java) serait d'initialiser des variables de champ immuables dans un constructeur en utilisant un simple private static
méthode pour réduire l'encombrement des constructeurs.
private
: les classes externes ne devraient pas le voir.static
: il peut effectuer une opération, indépendante1 de l'état de la classe Host.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);
}
}
1En supposant qu'il n'ait aucune interaction avec d'autres variables static
.
Un cas d'utilisation courant pour un private static
méthode est une méthode utilitaire qui est
Vous voyez que vous avez quelques lignes de code qui se répètent dans beaucoup de vos méthodes, vous décidez donc de les extraire dans 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 sans rapport l'appelle. (Débattez de 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 rendez plus facile à comprendre et peut-être même un peu plus rapide.
Alors .... (Peut-être maintenant, peut-être plus tard, peut-être jamais)
Une fois la méthode rendue statique, c'est clear qu'elle peut être déplacée hors de la classe, disons vers une classe d'unité.
Il est également facile de le transformer en une méthode d'instance de l'un de ses paramètres, c'est souvent là que le code devrait être.
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 souhaitez 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 souhaitez pas appeler directement. La méthode est toujours appelée sans instance, mais pas directement.
Bien sûr, "cela aide la classe à donner un sens" est une bonne raison en soi.
Généralement, si je trouve que j'écris des méthodes statiques privées, je le prends comme une indication qu'il y a quelque chose que j'aurais dû modéliser séparément.
Puisqu'elles ne sont pas liées à l'état d'une instance d'objet particulière, une collection de méthodes statiques publiques et privées pourrait former une classe entièrement distincte avec ses propres méthodes sémantiques et non statiques.
(Un autre conseil est que si je trouve que j'ai beaucoup de méthodes statiques (publiques et privées) qui ont toutes un paramètre commun d'un certain type, elles pourraient être mieux 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 comme ils sont indépendants, ils peuvent être mieux dans leur propre classe.)