it-swarm.com.de

Was bringt es, eine Methode als statisch zu deklarieren?

Ich habe kürzlich meine Warnungen in Eclipse durchgesehen und bin auf diese gestoßen:

static warning

Es wird eine Compiler-Warnung ausgegeben, wenn die Methode als statisch deklariert werden kann.

[edit] Genaues Zitat in der Eclipse-Hilfe, mit Betonung auf privat und final:

Wenn aktiviert, gibt der Compiler einen Fehler oder eine Warnung für Methoden aus, die privat oder final sind und sich nur auf statische Member beziehen.

Ja, ich weiß, dass ich es ausschalten kann, aber ich möchte den Grund für das Einschalten kennen?

Warum sollte jede mögliche Methode als statisch deklariert werden?

Wird dies zu Leistungsvorteilen führen? (in einer mobilen Domain)

Wenn Sie eine Methode als statisch kennzeichnen, zeigt dies vermutlich, dass Sie keine Instanzvariablen verwenden, die daher in eine utils-Stilklasse verschoben werden könnten.

Sollte ich diese Option am Ende des Tages einfach deaktivieren und ignorieren oder die mehr als 100 Warnungen korrigieren, die sie mir gegeben hat?

Denken Sie, dass dies nur zusätzliche Schlüsselwörter sind, die den Code verschmutzen , da der Compiler diese Methoden sowieso nur einfügt? (Art von wie Sie nicht jede Variable deklarieren können Sie endgültig , aber Sie könnten ).

93
Blundell

Wann immer Sie eine Methode schreiben, erfüllen Sie einen Vertrag in einem bestimmten Umfang. Je enger der Bereich ist, desto geringer ist die Wahrscheinlichkeit, dass Sie einen Fehler schreiben.

Wenn eine Methode statisch ist, können Sie nicht statische Member nicht zugreifen. Daher ist Ihr Anwendungsbereich enger. Wenn Sie also nicht benötigen und niemals (auch nicht in Unterklassen) nicht statische Mitglieder benötigen, um Ihren Vertrag zu erfüllen , warum geben Sie Ihrer Methode Zugriff auf diese Felder? Wenn Sie in diesem Fall die Methode static deklarieren, überprüft der Compiler, ob Sie keine Member verwenden, die Sie nicht verwenden möchten.

Darüber hinaus wird es den Lesern Ihres Codes helfen, die Art des Vertrags zu verstehen.

Aus diesem Grund empfiehlt es sich, eine Methode static zu deklarieren, wenn tatsächlich ein statischer Vertrag implementiert wird.

In einigen Fällen bezieht sich Ihre Methode nur auf eine Instanz Ihrer Klasse, und es kommt vor, dass bei der Implementierung kein nicht statisches Feld oder keine nicht statische Instanz verwendet wird. In solchen Fällen würden Sie die Methode static nicht markieren.

Beispiele dafür, wo Sie das Schlüsselwort static nicht verwenden würden:

  • Ein Erweiterungs-Hook, der nichts tut (aber mit Instanzdaten in einer Unterklasse etwas anfangen kann)
  • Ein sehr einfaches Standardverhalten, das in einer Unterklasse angepasst werden kann.
  • Implementierung der Ereignisbehandlungsroutine: Die Implementierung hängt von der Klasse der Ereignisbehandlungsroutine ab, verwendet jedoch keine Eigenschaft der Ereignisbehandlungsroutineninstanz.
130
Samuel Rossille

Hier gibt es kein Konzept zur Optimierung.

Eine static -Methode ist static, weil Sie diese Methode explizit deklarieren und nicht auf eine Instanz der einschließenden Klasse angewiesen sind, nur weil dies nicht erforderlich ist. Damit die Eclipse-Warnung, wie in der Dokumentation angegeben:

Wenn diese Option aktiviert ist, gibt der Compiler einen Fehler oder eine Warnung für Methoden aus, die privat oder endgültig sind und sich nur auf statische Member beziehen.

Wenn Sie keine Instanzvariable benötigen und Ihre Methode privat (kann nicht von außen aufgerufen werden) oder final (kann nicht überschrieben werden) ist, gibt es keinen Grund, sie als normale Methode statt als statische zuzulassen. Eine statische Methode ist von Natur aus sicherer, auch weil Sie weniger damit arbeiten dürfen (sie benötigt keine Instanz, Sie haben kein implizites this -Objekt).

13
Jack

Ich habe keine Informationen über die Leistung, ich nehme an, es ist höchstens geringfügig besser, da der Code keinen dynamischen Versand basierend auf dem Typ durchführen muss.

Ein viel stärkeres Argument gegen die Umgestaltung in statische Methoden ist jedoch, dass die derzeitige Verwendung von statischen Methoden als schlechte Praxis angesehen wird. Statische Methoden/Variablen lassen sich nicht gut in eine objektorientierte Sprache integrieren und sind auch schwer zu testen. Aus diesem Grund verzichten einige neuere Sprachen auf das Konzept der statischen Methoden/Variablen oder versuchen, sie auf eine Weise in die Sprache zu verinnerlichen, die besser mit OO (z. B. Objekte in Scala) funktioniert.

In den meisten Fällen benötigen Sie statische Methoden, um Funktionen zu implementieren, die nur Parameter als Eingabe verwenden und eine Ausgabe damit erstellen (z. B. Hilfsprogramm-/Hilfsfunktionen). In modernen Sprachen gibt es ein erstklassiges Funktionskonzept, das dies zulässt, also statisch wird nicht gebraucht. Java 8 wird Lambda-Ausdrücke enthalten, also bewegen wir uns bereits in diese Richtung.

6
Istvan Devai

1. Das Deklarieren von Methode static bietet einen leichten Leistungsvorteil, aber was nützlicher ist, ermöglicht es, sie zu verwenden, ohne eine Objektinstanz zur Hand zu haben (Denken Sie zum Beispiel an die Factory-Methode oder an einen Singleton). Es dient auch dem Dokumentationszweck, die Art der Methode zu beschreiben. Dieser Dokumentationszweck sollte nicht ignoriert werden, da er den Lesern des Codes und den Benutzern der API einen unmittelbaren Hinweis auf die Art der Methode gibt und auch als Denkhilfe für den ursprünglichen Programmierer dient Sie denken auch klar und produzieren Code mit besserer Qualität (ich denke, basierend auf meiner persönlichen Erfahrung, aber die Leute sind anders). Es ist beispielsweise logisch und daher wünschenswert, zwischen Methoden, die auf einen Typ angewendet werden, und Methoden zu unterscheiden, die auf eine Instanz des Typs angewendet werden (wie von Jon Skeet in seinem Kommentar zu einer C # -Frage ).

Ein weiterer Anwendungsfall für static Methoden ist die Nachahmung einer prozeduralen Programmierschnittstelle. Denken Sie an die Klasse Java.lang.System.println() und die darin enthaltenen Methoden und Attribute. Die Klasse Java.lang.System wird eher als Gruppennamensraum als als instanziierbares Objekt verwendet.

2. Wie kann Eclipse (oder eine andere programmierte oder andere Art von - biokomponierbaren oder nicht biokomponierbaren - Entitäten) sicher wissen, welche Methode als deklariert werden könnte statisch? Selbst wenn eine Basisklasse nicht auf Instanzvariablen zugreift oder nicht statische Methoden aufruft, können sich die Dinge durch den Vererbungsmechanismus ändern. Nur wenn die Methode nicht durch das Erben einer Unterklasse überschrieben werden kann, können wir mit 100% iger Sicherheit behaupten, dass die Methode wirklich als static deklariert werden kann. Das Überschreiben einer Methode ist genau in den beiden Seinsfällen unmöglich

  1. private (keine Unterklasse kann es direkt verwenden und weiß auch im Prinzip nichts darüber), oder
  2. final (auch wenn die Unterklasse darauf zugreifen kann, kann die Methode nicht geändert werden, um auf Instanzdaten oder -funktionen zu verweisen.).

Daher die Logik der Eclipse-Option.

3. Auf dem Originalposter wird auch gefragt: " Wenn Sie eine Methode als statisch kennzeichnen, wird vermutlich gezeigt, dass Sie keine Instanz verwenden Variablen könnten daher in eine utils-Stilklasse verschoben werden? "Dies ist ein sehr guter Punkt. Manchmal wird diese Art der Designänderung durch die Warnung angezeigt.

Es ist sehr nützlich, eine Option, die ich persönlich aktivieren möchte, wenn ich Eclipse verwende und in Java programmiere.

3
FooF

Siehe Samuels Antwort, wie sich der Umfang der Methode ändert. Ich denke, dies ist der Hauptaspekt, um eine Methode statisch zu machen.

Sie haben auch nach der Leistung gefragt:

Möglicherweise ergibt sich ein geringfügiger Leistungsgewinn, da für einen Aufruf einer statischen Methode nicht die implizite Referenz "this" als Parameter erforderlich ist.

Diese Auswirkungen auf die Leistung sind jedoch sehr gering. Daher dreht sich alles um den Umfang.

1
Black

Aus den Android Leistungsrichtlinien:

Statisch gegenüber virtuell bevorzugen Wenn Sie nicht auf die Felder eines Objekts zugreifen müssen, statisieren Sie Ihre Methode. Aufrufe werden ca. 15% -20% schneller sein. Es hat sich auch bewährt, da Sie anhand der Methodensignatur feststellen können, dass der Aufruf der Methode den Objektstatus nicht ändern kann.

http://developer.Android.com/training/articles/perf-tips.html#PreferStatic

1
Blundell

Nun, in der Eclipse-Dokumentation heißt es zu der fraglichen Warnung:

Methode kann statisch sein

Wenn diese Option aktiviert ist, gibt der Compiler einen Fehler oder eine Warnung für Methoden aus, die privat oder endgültig sind und sich nur auf statische Member beziehen

Ich denke, es sagt so ziemlich alles. Wenn die Methode privat und endgültig ist und sich nur auf statische Member bezieht, kann die betreffende Methode genauso gut als statisch deklariert werden, und dies macht deutlich, dass wir nur auf statischen Inhalt von ihr aus zugreifen möchten.

Ich glaube ehrlich gesagt nicht, dass es einen anderen mysteriösen Grund dafür gibt.

0
Edwin Dalorzo