Warum sollte es von Vorteil sein, eine statische Methode zu verwenden und die Referenz als Parameter an ein Objekt zu übergeben, anstatt die Methode für ein Objekt aufzurufen?
Betrachten Sie die folgende Klasse, um zu verdeutlichen, was ich meine:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public void incrementValue() {
someValue++;
}
}
Im Vergleich zu dieser alternativen Implementierung mit einer statischen Methode:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public static void incrementValue(SomeClass obj) {
obj.someValue++;
}
}
Meine Frage ist nicht nur auf diese Klasse beschränkt; Jeder Punkt, an dem Sie ein Objekt übergeben würden, anstatt es für eine Methode aufzurufen, interessiert mich. Ist das jemals vorteilhaft? Wenn ja warum?
java
object-oriented
static-methods
Addison Crump
quelle
quelle
Antworten:
Ein triviales Beispiel: Wenn die übergebene Instanz zu Recht null sein kann und Sie die (nicht triviale) Behandlung dieser Instanz in die Methode einbeziehen möchten.
quelle
In Ihrem Beispiel ist die Instanzmethode ein klarer Gewinner.
Im allgemeinen Fall kann ich mir einige Gründe vorstellen, aus denen eine statische Methode geeignet sein könnte:
Sie möchten die statische Methode in eine andere Klasse einfügen, da es sinnvoll ist, die Logik von den Daten zu trennen (Hinweis: Ihr Beispiel gehört nicht dazu).
Sie passieren zwei oder mehr Objekte und möchten betonen, dass sie gleich wichtig sind.
null
ist ein gültiger Wert (wie vom Benutzer 9000 erläutert).quelle
Es wäre ratsam, die Methoden, die den Status des Objekts ändern, als Instanzmethoden und nicht als statische Methode einzuschließen .
Wir können jedoch Beispiele für statische Methoden finden, die
pure
Methoden sind und das Objekt als Eingabe verwenden, beispielsweise wenn wir das Objekt basierend auf bestimmten Validierungsregeln instanziieren müssen. Beispielsweise verfügt .NET über die MethodeDateTime.TryParse(String s, DateTime d)
zum Validieren und Instanziieren des Objekts. Der ParameterDateTime d
ist jedoch explizit als gekennzeichnetout
.Ein anderer Fall kann sein, wenn wir die Objekte vergleichen und das gewünschte Objekt als Rückgabewert und nicht als booleschen / ganzzahligen Wert des Vergleichsergebnisses erhalten möchten, z
Team.GetHigherScorer(teamA, teamB).IncreaseRanking()
. Dies wird sauberer sein als:(Der Einfachheit halber wird der Fall "herausgezogen").
quelle
out
ist ein.Net
Schlüsselwort, das als Parametermodifikator verwendet wird. Es gibt an, dass der Parameter als Referenz übergeben wird. Siehe für Details msdn.microsoft.com/en-us/library/t3c3bfhx.aspxclass C { int x; static void M() {
ist M perfekt in der Lage zuzugreifenx
. Zum Beispielint y = (new C()).x;
ist legal.static void M() { this.x = 1; }
nicht möglich.this.x
nicht falsch ist, weilx
nicht zugegriffen werden kann, sondern weilthis
es nicht existiert. Es ist überhaupt keine Frage des Zugangs , es ist eine Frage der Existenz .Die Abhängigkeitsinjektion wäre ein guter Grund, den Aufruf der statischen Methode durchzuführen. Angenommen, die konkrete Implementierung von
SomeClass
hat eine Vererbungskette oder ist die Implementierung einer anderen Klasse. Sie können ein Modell eines Objekts verwenden, es zu Testzwecken übergeben, um sicherzustellen, dass Ihre Methode das tut, was es soll, und dann über diesen Status berichten.quelle