Beachten Sie, dass IDEA diese Inspektion auch für Java anbietet. Sie heißt Methode kann 'statisch' sein .
Diese Inspektion meldet alle Methoden, die sicher statisch gemacht werden können. Eine Methode kann statisch sein, wenn sie keine der nicht statischen Methoden und nicht statischen Felder ihrer Klasse referenziert und in einer Unterklasse nicht überschrieben wird ...
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:
Eine häufige Verwendung für statische Methoden ist der Zugriff auf statische Felder.
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 :
Jede vom Instanzstatus unabhängige Methode kann als statisch deklariert werden.
Beachten Sie, dass ich "Kandidat für die Deklaration als statisch" sage. Selbst im vorherigen Beispiel zwingt Sie nichts dazu, instances()
statisch zu deklarieren . Wenn Sie es als statisch deklarieren, ist der Aufruf einfacher, da Sie keine Instanz zum Aufrufen der Methode benötigen. Manchmal gibt es Methoden, die nicht vom Instanzstatus abhängig zu sein scheinen. Möglicherweise möchten Sie diese Methoden nicht statisch machen. Tatsächlich möchten Sie sie wahrscheinlich nur als statisch deklarieren, wenn Sie ohne Instanz darauf zugreifen müssen.
Auch wenn Sie eine solche Methode als statisch deklarieren können, möchten Sie dies möglicherweise nicht, da Vererbungsprobleme in Ihrem Entwurf auftreten. Schauen Sie sich "Effektives objektorientiertes Design" an, um einige der Probleme zu sehen, mit denen Sie konfrontiert sind ...
Ein Artikel im Google-Testblog geht sogar so weit, zu behaupten, dass statische Methoden der Testbarkeit zum Opfer fallen :
Lass uns eine mentale Übung machen. Angenommen, Ihre Anwendung verfügt nur über statische Methoden. (Ja, Code wie dieser kann geschrieben werden, man nennt ihn prozedurale Programmierung.) Stellen Sie sich nun den Aufrufgraphen dieser Anwendung vor. Wenn Sie versuchen, eine Blattmethode auszuführen, haben Sie kein Problem damit, ihren Status einzurichten und alle Eckfälle zu bestätigen. Der Grund dafür ist, dass eine Leaf-Methode keine weiteren Aufrufe ausführt. Je weiter Sie sich von den Blättern entfernen und sich der Wurzelmethode main()
nähern, desto schwieriger wird es, den Status in Ihrem Test festzulegen und Dinge zu behaupten. Viele Dinge werden unmöglich zu behaupten sein. Ihre Tests werden immer größer. Sobald Sie die erreichenmain()
Methode Sie haben keinen Unit-Test mehr (da Ihre Unit die gesamte Anwendung ist), haben Sie jetzt einen Szenario-Test. Stellen Sie sich vor, die Anwendung, die Sie testen möchten, ist ein Textverarbeitungsprogramm. Es gibt nicht viel, was Sie von der Hauptmethode behaupten können ...
Manchmal ist eine statische Methode eine Fabrik für andere Objekte. Dies verschärft das Testproblem weiter. In Tests verlassen wir uns darauf, dass wir Objekte unterschiedlich verdrahten können und wichtige Abhängigkeiten durch Mocks ersetzen. Sobald ein new
Operator aufgerufen wird, können wir die Methode nicht mit einer Unterklasse überschreiben. Ein Aufrufer einer solchen statischen Fabrik ist permanent an die konkreten Klassen gebunden, die die Methode der statischen Fabrik erzeugt hat. Mit anderen Worten, der Schaden der statischen Methode geht weit über die statische Methode selbst hinaus. Das Zusammenführen von Objektgraphenverdrahtung und Konstruktionscode in eine statische Methode ist besonders schlecht, da Objektgraphenverdrahtung das Isolieren von Dingen zum Testen ist ...
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:
Wenn die zu testende Groovy-Klasse eine statische Methode für eine andere Groovy-Klasse aufruft, können Sie die ExpandoMetaClass verwenden, mit der Sie dynamisch Methoden, Konstruktoren, Eigenschaften und statische Methoden hinzufügen können ...
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.