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?
java
object-oriented
static-methods
Addison Crump
la source
la source
Réponses:
Un exemple trivial: lorsque l'instance transmise peut légitimement être nulle et que vous souhaitez incorporer la gestion (non triviale) de cela dans la méthode.
la source
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).la source
Il serait judicieux d'inclure les méthodes qui modifient l'état de l'objet en tant que méthodes d' instance plutôt qu'en tant que méthode statique .
Cependant, nous pouvons trouver des exemples de méthodes statiques qui sont des
pure
méthodes et prennent 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éthodeDateTime.TryParse(String s, DateTime d)
pour valider et instancier l'objet. Mais le paramètreDateTime d
est explicitement marqué commeout
.Un autre cas peut être lorsque nous comparons les objets et que nous voulons obtenir l'objet souhaité comme valeur de retour plutôt qu'une valeur booléenne / entière du résultat de la comparaison, par exemple
Team.GetHigherScorer(teamA, teamB).IncreaseRanking()
,. Ce sera plus propre que:(laissant le cas "tirer" pour plus de simplicité).
la source
out
est un.Net
mot - clé utilisé comme modificateur de paramètre. Il indique que le paramètre est transmis par référence. Voir pour plus de détails msdn.microsoft.com/en-us/library/t3c3bfhx.aspxclass C { int x; static void M() {
alors M est parfaitement en mesure d'accéderx
. Par exemple,int y = (new C()).x;
c'est légal.static void M() { this.x = 1; }
n'est pas possible.this.x
c'est faux non pas parcex
qu'on ne peut pas y accéder mais parce qu'ilthis
n'existe pas. Ce n'est pas du tout une question d' accès , c'est une question d' existence .L'injection de dépendances serait une bonne raison d'effectuer l'appel à la méthode statique. En supposant que l'implémentation concrète de
SomeClass
possède une chaîne d'héritage ou soit 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.la source