Verwenden privater statischer Methoden

Was halten Sie davon, private statische Methoden zu verwenden?

Persönlich bevorzuge ich die Verwendung einer statischen statischen privaten Methode für nicht-statisches , solange es keinen Zugriff auf Instanzfelder erfordert.

Aber ich habe gehört, dass diese Praxis gegen OOP-Prinzipien verstößt.

Edit: Ich frage mich aus StilPerspektive der Sicht, nicht Leistung.

Antwort auf "Verwenden privater statischer Methoden " 7 von antworten

Ich sehe nicht unbedingt ein wirkliches Problem mit dem, was Sie tun, aber meine erste Frage wäre, wenn die Methode keinen Zugriff auf Instanzfelder erfordert, was macht sie dann überhaupt in dieser Klasse?

Es ist eine Frage des Geschmacks, aber ich mache Methoden, die nicht auf einen Zustand innerhalb des Objekts statisch reagieren. Auf diese Weise muss ich code nicht umschreiben, wenn eine statische Funktion eine ähnliche Funktionalität benötigt. Eine Sortierfunktion wäre ein gutes Beispiel für einen solchen Fall.

private oder öffentliche macht keinen Unterschied - statische Methoden sind OK, aber wenn Sie feststellen, dass Sie sie die ganze Zeit verwenden (und natürlich Instanzmethoden, die nicht auf Instanzfelder zugreifen, sind im Grunde statische Methoden für diesen Zweck), dann müssen Sie wahrscheinlich den Entwurf überdenken. Es ist nicht immer möglich, aber die meiste Zeit Methoden sollten mit den Daten, die sie arbeiten - das ist die Grundidee von OOP.

Ich neige dazu, keine privaten statischen Methoden zu verwenden. Ich verwende öffentliche statische Methoden und gruppiere sie in Util-Klassen, um die Wiederverwendung zu fördern.

Eine private static method by itself does not violate OOP per se, but when you have a lot of these methods on a class that don't need (and cannot*) access instance fields, you are not programming in an OO way, because "object" implies state + operations on that state defined together. Why are you putting these methods on that class, if they don't need any state? Methode selbst verstößt nicht an sich gegen OOP, aber wenn Sie viele dieser Methoden für eine Klasse haben, die keinen Zugriff auf Instanzfelder benötigt (und nicht kann*), programmieren Sie nicht auf OO-Weise, da "Objekt" Status+ Operationen für diesen Zustand zusammen definiert impliziert. Warum setzen Sie diese Methoden auf diese Klasse, wenn sie keinen Zustand benötigen?

(*) = Grundsätzlich hat eine statische Methode einer Klasse aufgrund der Sichtbarkeit auf Klassenebene in Java natürlich Zugriff auf Instanzfelder eines Objekts dieser Klasse, z. B.:

class Test
{
  int field = 123;

  private static void accessInstance(Test test)
  {
    System.out.println(test.field);
  }
}

Sie müssen den Verweis auf eine Instanz (this pointer) yourself of course, but then you are essentially mimicking instance methods. Just mentioning this for completeness.-Zeiger) selbst selbst übergeben, aber dann imitieren Sie im Wesentlichen Instanzmethoden. Nur dies der Vollständigkeit zu erwähnen.

Private statische Methoden können z. B. auf privaten statischen Membern ihrer Klasse ausgeführt werden. Dies kann verwendet werden, um bestimmte klassenspezifische Vorgänge zu kapseln und zu vereinigen.

Der Hauptnachteil der Verwendung statischer Methoden ist meiner Meinung nach die Tatsache, dass man die Möglichkeit der Überschreibung wegwirft. Da Klassen in Java nicht wie, sagen wir, Klassen in Smalltalk sind, können Sie statische Methoden nicht überschreiben.

Da sich Ihre Frage auf private statische Methoden bezieht, ist das Überschreiben ohnehin nicht möglich.

Ich neige dazu, statische Methoden nur bei Dienstprogrammklassen (wie java.lang.Math) oder Mustern wie dem Singleton-Muster zu verwenden. All dies erfordert eine höhere Sichtbarkeit als private, da sie Dienstleistungen darstellen, die ihre Klasse anderen zur Verfügung stellt.

Letzter Gedanke: Wenn Sie eine oder mehrere private statische Methoden haben, denken Sie darüber nach, sie in eine dedizierte Gebrauchsklasse zu extrahieren und öffentlich zu machen. Noch besser, machen Sie sie Instanz-Methoden und verwenden Sie das Singleton-Muster.

Wie oben erwähnt, sind private statische Methoden oft nützlich, um wiederverwendete Logik zu organisieren und wiederholten Code zu reduzieren/eliminieren. Ich bin überrascht, dass ich in dieser Diskussion keine Erwähnung von Leistung bemerkt habe. Aus Renaud Walduras 'The Final Word on Final':

(Hinweis, private statische Methoden sind implizit endgültig)

"Da eine endgültige Methode nur in der deklarierenden Klasse implementiert ist, ist es nicht erforderlich, dynamisch einen Aufruf an eine endgültige Methode zu senden, und stattdessen kann ein statischer Aufruf verwendet werden. Der Compiler kann einen direkten Aufruf der Methode aussenden und dabei die übliche Prozedur für den Aufruf virtueller Methoden vollständig umgehen. Aus diesem Grund sind endgültige Methoden auch Kandidaten für die Inlining durch einen Just-In-Time-Compiler oder ein ähnliches Optimierungstool. (Denken Sie daran, private/statische Methoden sind bereits endgültig, daher immer für diese Optimierung in Betracht gezogen.)" " -63-" Schauen Sie sich das ganze Papier an: http://renaud.waldura.com/doc/java/final-keyword.shtml