2009-03-26 7 views
31

Was denken Sie über die Verwendung private statische Methoden?Verwenden von privaten statischen Methoden

Ich persönlich lieber mit einer statischen privaten Methode zu nicht-statischen, solange es dem Zugriff auf alle Instanzfelder nicht erforderlich.

Aber ich habe gehört, dass diese Praxis OOP Prinzipien verletzt.

Edit: Ich wundere mich von Stil prospektiv der Ansicht, nicht Leistung.

+0

Danke. Konnte es nicht finden. –

Antwort

34

Eine private static Methode selbst verletzt OOP per se nicht, aber wenn Sie viele dieser Methoden in einer Klasse haben, die keine Instanzfelder benötigen (und nicht können), programmieren Sie nicht auf eine OO-Weise , weil "object" state + -Operationen für diesen zusammen definierten Zustand bedeutet. Warum setzen Sie diese Methoden auf diese Klasse, wenn sie keinen Zustand benötigen?

(*) = grundsätzlich aufgrund der Klassenebene Sichtbarkeit in Java, eine statische Methode auf eine Klasse hat Zugriff auf Instanzfelder eines Objektes dieser Klasse, zum Beispiel:

class Test 
{ 
    int field = 123; 

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

Sie müssen natürlich selbst den Verweis auf eine Instanz übergeben (this Zeiger), aber dann Imitieren Sie im Wesentlichen Instanzmethoden. Erwähnen Sie dies nur zur Vollständigkeit.

+0

Gute Punkte. Ein Gegenargument für statische Methoden wäre die Kohäsion, aber wenn Sie zu viele Argumente haben, könnte dies bedeuten, dass die Klasse ihre Absichten übertroffen hat. –

2

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

+0

Dies kann passieren, wenn ich bestimmte Prüfungen für Eingabeparameter in einer öffentlichen Methode anwenden muss. Wie eine kleine Hilfsmethode. –

+0

... oder wenn Sie mit den statischen Feldern zu tun haben, offensichtlich = 8-) – Yuval

+0

@Andrey - das macht Sinn. Wie ich schon sagte, es ist nur die erste Frage, die ich mir stellen würde, wenn ich selbst dasselbe tun würde. Oft können diese "Helfer" -Methoden für andere Dinge nützlich sein und besser in eine andere Klasse umgestaltet werden. Aber dann, manchmal sind sie nicht auch :) –

0

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 den Code nicht neu schreiben, wenn eine statische Funktion eine ähnliche Funktionalität benötigt. Eine Sortierfunktion wäre ein gutes Beispiel für einen solchen Fall.

3

privat oder öffentlich macht keinen Unterschied - statische Methoden sind in Ordnung, aber wenn Sie feststellen, dass Sie sie ständig verwenden (und natürlich Instanzmethoden, die nicht auf Instanzfelder zugreifen sind grundsätzlich statische Methoden für Dieser Zweck), dann müssen Sie wahrscheinlich das Design überdenken. Es ist nicht immer möglich, aber die meisten Methoden sollten sich auf die Daten beziehen, auf denen sie arbeiten - das ist die Grundidee von OOP.

0

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

+1

Und was haben Sie mit Methoden zu tun, die zu spezifisch für die gemeinsame Nutzung sind? Für einige allgemeine Funktionen entpacke ich Methoden auch zu Utility-Klassen. –

+1

Urgh. Gruppieren Sie keine Methoden nach dem Zufallsprinzip. –

0

Private statische Methoden können zum Beispiel auf privaten statischen Mitgliedern ihrer Klasse arbeiten. Dies kann verwendet werden, um bestimmte klassenspezifische Operationen zu kapseln und zu vereinheitlichen.

Der Hauptnachteil der Verwendung von statischen Methoden ist meiner Meinung nach die Tatsache, dass man die Möglichkeit zum Überschreiben wegwirft. Da Klassen in Java nicht wie zum Beispiel 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 Utility-Klassen (wie java.lang.Math) oder Mustern wie dem Singleton-Muster zu verwenden. Alle diese erfordern eine höhere Sichtbarkeit als private, da sie Dienste darstellen, die von ihrer Klasse für andere bereitgestellt werden.

Schlussgedanke: Wenn Sie eine oder mehrere private statische Methoden haben, denken Sie daran, sie in eine dedizierte Dienstprogrammklasse zu extrahieren und sie öffentlich zu machen. Noch besser, machen Sie sie Instanzmethoden und verwenden Sie das Singleton-Muster.

19

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. Von Renaud Waldura ‚The Final Word auf Final‘:

(Beachten Sie, sind private statische Methoden implizit final)

„Da eine endgültige Methode nur in der Erklärung der Klasse implementiert wird, gibt es keine Notwendigkeit, einen dynamisch versenden Aufruf an eine finale Methode, und stattdessen kann ein statischer Aufruf verwendet werden.Der Compiler kann einen direkten Aufruf an die Methode senden, wobei das übliche Verfahren zum Aufruf virtueller Methoden umgangen wird.Aus diesem Grund sind endgültige Methoden auch Kandidaten für Inlining durch ein Just-In -Time-Compiler oder ein ähnliches Optimierungstool (Denken Sie daran, dass private/statische Methoden bereits endgültig sind und daher immer für diese Optimierung in Betracht gezogen werden.) "

Auschecken t er ganzes Papier: http://renaud.waldura.com/doc/java/final-keyword.shtml