Pourquoi y aurait-il un avantage à utiliser une méthode statique et à passer la référence à un objet en tant que paramètre plutôt que d'appeler la méthode sur un objet?
Pour clarifier ce que je veux dire, considérez la classe suivante:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public void incrementValue() {
someValue++;
}
}
Par rapport à cette implémentation alternative avec une méthode statique:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public static void incrementValue(SomeClass obj) {
obj.someValue++;
}
}
Ma question ne se limite pas à cette seule classe; n'importe quel point où vous passeriez un objet au lieu de l'appeler sur une méthode est ce qui m'intéresse. Est-ce jamais avantageux? Si oui, pourquoi?
Un exemple trivial: lorsque l'instance passée peut légitimement être nulle et que vous souhaitez incorporer la gestion (non triviale) de cela dans la méthode.
Dans votre exemple, la méthode d'instance est clairement gagnante.
Dans le cas général, je peux penser à quelques raisons pour lesquelles une méthode statique pourrait être appropriée:
Vous voulez mettre la méthode statique dans une autre classe, car vous avez une situation où il est logique de séparer la logique des données (remarque: votre exemple n'est pas l'un d'eux).
Vous passez deux ou plusieurs objets et vous voulez souligner qu'ils sont d'égale importance.
null
est une valeur valide (comme expliqué par l'utilisateur 9000).
Il serait judicieux d'inclure les méthodes qui changent l'état de l'objet en tant que instances plutôt que statiques méthode.
Cependant, nous pouvons trouver des exemples de méthodes statiques qui sont des méthodes pure
et prendre l'objet en entrée, comme lorsque nous devons instancier l'objet en fonction de certaines règles de validation. Par exemple, . NET a la méthode DateTime.TryParse(String s, DateTime d)
pour valider et instancier l'objet. Mais le paramètre DateTime d
Est explicitement marqué comme out
.
Un autre cas peut être lorsque nous comparons les objets et que nous voulons obtenir l'objet souhaité comme valeur de retour plutôt que comme une valeur booléenne/entière du résultat de la comparaison, par exemple, Team.GetHigherScorer(teamA, teamB).IncreaseRanking()
. Ce sera plus propre que:
int compareResult = teamA.compareScoreWith(teamB);
if (compareResult == 1)
teamA.IncreaseRanking();
else if (compareResult == -1)
teamB.IncreaseRanking();
(laissant le cas "tirer" pour plus de simplicité).
L'injection de dépendance serait une bonne raison d'effectuer l'appel à la méthode statique. En supposant que l'implémentation concrète de SomeClass
a une chaîne d'héritage ou est l'implémentation d'une autre classe. Vous pouvez utiliser une maquette d'un objet, la transmettre à des fins de test pour vous assurer que votre méthode fait ce qu'elle est censée faire, puis rendre compte de cet état.