Warum würden Sie keine statischen Methoden für alle privaten Methoden verwenden?

7

Ich versuche, statische Methoden zu verstehen, und ich habe einen verwirrenden Punkt erreicht.

Wenn ich nur auf Methoden für diese Frage konzentriere, wenn ich eine Instanz meines Objekts erstelle (wo die Klasse selbst nicht statisch ist), dann habe ich normalerweise nur Zugriff auf die öffentlichen, geschützten und / oder internen Methoden (abhängig von Umfang / Kapselung) . Mit anderen Worten, ich habe keinen Zugriff auf private Methoden.

Ich habe gelesen, dass minimale, statische Methoden etwas effizienter sind als nicht statische Methoden.

Wenn Sie also eine private Methode mit dem Rückgabetyp void erstellen und beim Erstellen einer Referenz eines Objekts aus sich selbst ausschließen, warum sollten Sie sie niemals statisch machen? All der Code, den ich je gesehen habe, tut das nicht, also kann ich nur annehmen, dass ich den Punkt verpasst habe.

    
Dave 14.05.2013, 13:40
quelle

7 Antworten

29

Statische Methoden können nicht auf die nicht statischen Elementdaten in der Klasse zugreifen.

    
Bathsheba 14.05.2013, 13:41
quelle
6

Statische Methoden sollen normalerweise zustandslos sein und haben daher keinen Zugriff auf den Instanzzustand. Im Gegensatz dazu sind Instanzmethoden statusful und können daher den Zustand der Instanz lesen und ändern.

Typische Beispiele für zustandslose Methoden sind:

  • Fabrikmethoden
  • Binäre Operatoren
  • ...

Natürlich sind statische Methoden nicht immer , obwohl es Beispiele für statische Stateful-Methoden gibt. Es gibt einen einzigen Zustand für die Klasse :

  • Singleton
  • Instanzpools
  • ...

Diese Implementierungen benötigen jedoch etwas mehr Sorgfalt, da der Klassenstatus auch von allen Threads innerhalb des Prozesses gemeinsam genutzt wird.

    
Matthias Meid 14.05.2013 13:42
quelle
1
  

Ich habe gelesen, dass minimale, statische Methoden etwas effizienter sind als nicht statische Methoden.

Das ist nicht unbedingt richtig: Nur die Methoden, die sonst static wären, aber nicht static wären, wären effizienter. Andernfalls müssten Sie manuell einen Verweis auf das Objekt übergeben und das Spielfeld auf gleiche Höhe bringen. Darüber hinaus ist CLR so optimiert, dass der Unterschied schwer zu messen ist.

Um Ihre Frage zu beantworten, gibt es keinen Grund, eine Methode nicht statisch zu machen, wenn sie nicht über Eigenschaften oder Variablen auf den Instanzstatus zugreift. Alle Methoden, die auf den Status einer Instanz zugreifen, sollten jedoch aus Gründen der Lesbarkeit nicht statisch sein, da keine Leistung erzielt werden kann, wenn sie statisch gemacht werden und die Instanz manuell übergeben wird.

Um den Punkt zu verdeutlichen, sollten Sie dies tun

%Vor%

und nicht:

%Vor%     
dasblinkenlight 14.05.2013 13:46
quelle
1

Sie können nicht auf nicht statische Member in der Klasse zugreifen, wenn Sie dies tun. Sie können beliebige Instanzvariablen als Parameter an eine private statische Funktion übergeben, aber insbesondere wenn eine Funktion mit vielen Instanzdaten interagiert, kann dies zu etwas sehr aufgeblähten und schwer lesbaren Code führen. Wenn Sie mit Instanzmembern einer Klasse arbeiten und es sich nicht um eine Operation handelt, die ohne eine Instanz Ihrer Klasse ausgeführt werden kann, sollten Sie sie nicht statisch machen.

Als grundlegende allgemeine Regel mache ich Variablen oder Funktionen nicht statisch, es sei denn, sie sind für alle Instanzen der Klasse von Bedeutung. Es gibt natürlich Ausnahmen, aber wenn Sie einfach alle Ihre privaten Methoden ohne Grund statisch machen, werden Sie wahrscheinlich gegen das OOP-Paradigma arbeiten.

    
Bender the Greatest 14.05.2013 13:51
quelle
0

Die meisten Methoden, die Sie im Code sehen, verwenden irgendwie Klassenvariablen / Eigenschaften, die nicht statisch sind. Auf diese kann nicht aus einem statischen Kontext zugegriffen werden. Dies bedeutet, dass Sie innerhalb einer statischen Methode nur auf statische Member dieser Klasse und nicht auf die objektspezifischen zugreifen können.

    
Toon Casteele 14.05.2013 13:44
quelle
0

Ich denke, es ist sehr nützlich, Methoden zumindest als statisch zu definieren, um klarzustellen, dass sie keine Daten von einer Instanz benötigen. Das heißt, ich bevorzuge Nichtmitgliedsfunktionen. Sehen Sie sich Class design vs. IDE an: Sind nicht Mitglieder Nicht-Freunde-Funktionen sind es wirklich wert? .

    
ctn 14.05.2013 13:46
quelle
0

Zwei Gründe kommen mir in den Sinn:

  1. Sie können nicht auf andere nicht-statische Mitglieder Ihrer Klasse zugreifen (siehe oben)
  2. Sie können die statische Methode in Unterklassen nicht überschreiben

IMO, statische Methoden sollten eher eine Ausnahme sein. Wenn Sie einen "einfachen Zugriff" auf eine Funktionalität in einer Anwendung mit Abhängigkeitsinjektionscontainer wünschen, sollten Sie eine Singleton-Bean verwenden und sie injizieren, da Sie bei Bedarf immer noch die Möglichkeit haben, die Implementierung einfach zu wechseln.

.NET hat einen spezifischen Anwendungsfall für statische Methoden - Erweiterungsmethoden. Wenn Sie also Ihre Funktionalität als Erweiterungsmethode zur Verfügung haben möchten, müssen Sie statisch verwenden.

    
j_maly 23.03.2015 09:04
quelle

Tags und Links