Kürzlich habe ich angefangen, in Groovy für ein Integrationstest-Framework für ein Java-Projekt zu programmieren. Ich verwende Intellij IDEA mit dem Groovy-Plug-In und bin überrascht, dass dies eine Warnung für alle Methoden ist, die nicht statisch sind und von keinen Instanzfeldern abhängen. In Java ist dies jedoch kein Problem (zumindest aus Sicht der IDE).
Sollten alle Methoden, die nicht von Instanzfeldern abhängig sind, in statische Funktionen umgewandelt werden? Wenn dies zutrifft, ist dies spezifisch für Groovy oder für OOP im Allgemeinen verfügbar? Und warum?
Antworten:
Beachten Sie, dass IDEA diese Inspektion auch für Java anbietet. Sie heißt Methode kann 'statisch' sein .
Allerdings ist diese Überprüfung für Java-Code standardmäßig deaktiviert (der Programmierer kann sie nach eigenem Ermessen aktivieren ). Der Grund dafür ist höchstwahrscheinlich, dass die Gültigkeit / Nützlichkeit einer solchen Inspektion aufgrund einiger recht maßgeblicher Quellen in Frage gestellt werden könnte.
So starten Sie mit, offiziellen Java - Tutorial ist ziemlich restriktiv , wenn Methoden statisch sein sollte:
Angesichts der obigen Ausführungen könnte man argumentieren, dass das Aktivieren der standardmäßig erwähnten Überprüfung nicht der empfohlenen Verwendung des statischen Modifikators in Java entspricht.
Außerdem gibt es einige andere Quellen, die einen vernünftigen Ansatz für die Verwendung von Ideen vorschlagen, die hinter dieser Inspektion stehen oder sie sogar entmutigen.
Siehe zum Beispiel Java World Artikel - Mr. Happy Object lehrt statische Methoden :
Ein Artikel im Google-Testblog geht sogar so weit, zu behaupten, dass statische Methoden der Testbarkeit zum Opfer fallen :
Wie Sie oben sehen, ist es nur natürlich, dass die erwähnte Überprüfung für Java standardmäßig deaktiviert ist.
IDE-Entwickler würden es sehr schwer haben, zu erklären, warum es ihrer Meinung nach so wichtig ist, es standardmäßig zu aktivieren, und zwar gegen allgemein anerkannte Empfehlungen und Best Practices.
Bei Groovy sieht das ganz anders aus. Keines der oben aufgeführten Argumente trifft zu, insbesondere nicht das Argument zur Testbarkeit, wie z. B. in Mocking Static Methods im Groovy- Artikel von Javalobby erläutert:
Dieser Unterschied ist wahrscheinlich der Grund, warum die Standardeinstellung für die erwähnte Überprüfung in Groovy entgegengesetzt ist. Während in der Java-Standardeinstellung "Ein" zu Verwirrung der Benutzer führen würde, könnte in Groovy eine entgegengesetzte Einstellung die IDE-Benutzer verwirren.
"Hey, die Methode verwendet keine Instanzfelder. Warum haben Sie mich nicht gewarnt?" Diese Frage wäre für Java (wie oben erläutert) leicht zu beantworten, aber für Groovy gibt es einfach keine überzeugende Erklärung.
quelle
Es ist kaum vorstellbar, dass sich dies spürbar auf die Leistung auswirkt. Der einzige Vorteil, den ich sehen kann,
static
ist, dass er visuell anzeigt, dass der Instanzstatus nicht betroffen ist. Mit anderen Worten, es sagt der Person, die den Quellcode liest, etwas ... "Interessantes" über diese Methode, nur weil sie da ist. Die eigentliche Frage ist, ob es klarstellt oder verwirrt. "Warum ist diese Methode statisch? Handelt es sich um eine Factory-Methode? Kann sie aufgerufen werden, ohne dass eine Objektinstanz erforderlich ist?"Außerdem mögen manche Leute keine statischen Methoden, weil sie behaupten, dass man sie nicht verspotten kann, und deshalb sind sie nicht testbar oder ähnliches. Natürlich, wenn Sie es aus einem der üblichen Gründe statisch machen, wie zum Beispiel eine Factory-Methode, dann bin ich alles dafür. Ich bin mir nur nicht ganz sicher, ob es ein Mandat ist, Methoden statisch zu machen, nur weil sie den Instanzstatus nicht berühren.
quelle
final
Hinblick auf die Vererbung oder speziell dafür entworfen werden sollten .Ich denke , es ist möglich , Refactoring zu ermöglichen, werden gesichtet .
Sobald die Methode statisch gemacht wurde, ist klar, dass sie aus der Klasse verschoben werden kann, beispielsweise zu einer Einheitsklasse.
Es ist auch einfach, es in eine Instanzmethode eines seiner Parameter umzuwandeln. Oft ist dies der Ort, an dem sich der Code befinden sollte.
quelle
Beachten Sie, dass Sie möglicherweise zustandslose Klassen haben, die eine Schnittstelle implementieren (z. B.
java.lang.Runnable
- Sie können ihre Methoden nicht statisch machen. Einige Muster (z. B. Strategie) können auch zustandslose Objekte erzeugen, die möglicherweise sogar mehrere Methoden haben.Statik sind erste Cousins der Singletons. Es wird sehr schwierig sein, zu einem späteren Zeitpunkt von statisch zu nicht statisch zu wechseln. Wenn Sie also einen Status hinzufügen müssen, werden Sie versucht sein, statische Variablen einzuführen.
quelle