2013-04-18 19 views
5

Imagine IInstanzvariablen an Instanzmethoden übergeben oder direkt auf sie zugreifen?

String instanceMember; 

Weiteres Ich habe wie 4 Beispiel Methoden Zugriff auf dieses Mitglied eine Klasse mit einer Instanz Mitglied hat. Jetzt frage ich mich, ob es einen echten Pro/Con gibt, entweder direkt auf das Instanzmitglied von den Instanzmethoden zuzugreifen oder das Instanzmitglied als einen Parameter an jede der Instanzmethoden zu übergeben?

+0

Grundsätzlich, was "sich richtig anfühlt". Manchmal ist es eine gute Idee, die Referenz zu übergeben, genauso wie eine Art "Dokumentation", mit der Sie arbeiten. (Aber keine Angst, zurückzugehen und ein Parm-Passing-Schema zu ändern, wenn es anfängt falsch zu erscheinen - viele Greueltaten werden im Namen der Vermeidung von (trivialen) Änderungen begangen.) –

Antwort

0

Wenn diese Methoden öffentliche Methoden sind, die den Status einer persistenten Membervariablen ändern, sollten Sie sie nicht wirklich weitergeben. Zum Beispiel, wenn Sie so etwas wie die folgenden zu tun haben, sollte es wahrscheinlich direkt durch das Verfahren manipuliert werden, anstatt in weitergegeben werden:

myObject.SomeMethod(myObject.instanceMember, 15); 

Dies soll eigentlich nur sein:

myObject.SomeMethod(15); 

Wenn es etwas, das sich pro Aufruf ändern könnte (wie zum Beispiel das mysteriöse 15 in der obigen Methode), du wirst es weitergeben wollen.

6

Das Übergeben des Werts als Parameter würde bedeuten, dass Sie die Berechnung mit dem Parameterwert und nicht mit dem gekapselten Wert durchführen.

Wenn Sie mit gekapselten Daten arbeiten, gibt es keinen Grund, sie als Parameter zu verwenden.

1

Der Grund für Instanz Variablen in erster Linie aufweist, ist sie als Parameter zu vermeiden vorbei: Ihre Instanz Methode ruft sie den Zugriff auf „kostenlos“, da sie bereits in den Anwendungsbereich der Methode sind.

Es gibt zwei Gründe Instanzvariablen Methoden, wenn auch weitergeben müssen:

  • Die Methode ist static - Klasse Methoden nicht Instanzvariablen zugreifen, so dass Sie sie brauchen explizit übergeben, oder das Objekt weitergeben was zu betreiben
  • Sie müssen Pass-by-Wert semantische verwenden - mit anderen Worten, Sie möchten den Wert übergeben, und in dem möchten Sie vermeiden, eine lokale Variable zu erstellen. Dies ist häufig der Fall, wenn die Methode rekursiv ist.

Wenn Sie sich rekursive Code zu schreiben, der einen Parameter ändert, die als Instanzvariable begann, in vielen Fällen kann es eine gute Idee, Ihre Methode private static, und fügen Sie eine public Instanz Methode, um die rekursive zu starten Kette und um die Ergebnisse zu ernten.

+1

In diesem zweiten Fall wird die Instanzvariable technisch nicht übergeben . –

+0

@HotLicks Guter Punkt, danke! Ich habe unten eine Diskussion hinzugefügt, um zu erläutern, was im zweiten Fall zu tun ist. – dasblinkenlight

+0

Ich denke, dass die "pass-by-value semantische" Sache verwirrt wird, wenn Sie über Objekte sprechen. Indem Sie einen Objektreferenz in die Methode übergeben, anstatt die Methode auf die Instanzvariable verweisen zu lassen, ändern Sie nicht die Tatsache, dass das Ändern des Objekts globale Auswirkungen hat. In diesem Bereich werden Neulinge manchmal ernsthaft verwirrt. –

0

Es hängt viel davon ab, wie Sie es verwenden. Wenn die Verwendung Ihrer Klasse selten ist, dann wird es keinen offensichtlichen Unterschied geben.

Wenn Sie die Klasseninstanz sehr oft und mit vielen Threads verwenden, würde die Übergabe als Parameter bei einigen Bedingungen ein wenig schneller funktionieren.

Normalerweise werden Instanzmitglieder direkt von Klassenmitgliedern mit Ausnahme statischer Funktionen (aus offensichtlichen Gründen) angesprochen.

Folgen Sie also Ihren Kodierungskonventionen und machen Sie sich keine Sorgen. Bis es wirklich wichtig ist, werden Sie die Antwort auswendig wissen.