Was bringt es, eine Methode als statisch zu deklarieren?

Lesezeit: 9 Minuten

Benutzer-Avatar
Blundell

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

statische Warnung

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 sind Privatgelände oder Finale und die sich nur auf statische Member beziehen.

Ja, ich weiß, ich kann es ausschalten, aber ich will Kennen Sie den Grund für das Einschalten?

Warum wäre es gut, jede mögliche Methode als statisch zu deklarieren?

Wird dies Leistungsvorteile bringen? (in einer mobilen Domäne)

Auf eine Methode als statisch hinzuweisen, zeigt wohl, dass Sie keine Instanzvariablen verwenden und daher in eine Klasse im utils-Stil verschoben werden könnten?

Soll ich das am Ende des Tages einfach auf „Ignorieren“ ausschalten oder die über 100 Warnungen beheben, die es mir gegeben hat?

Glauben Sie, dass dies nur zusätzliche Schlüsselwörter sind? schmutzig den Code, da der Compiler diese Methoden sowieso nur einbettet? (So ​​ähnlich wie Sie nicht jede Variable deklarieren, die Sie finalisieren können aber du könntest).

  • Unsicher, aber dies könnte einfach als Programmierhilfe angesehen werden. Warnungen sind lediglich Hinweise auf Dinge, auf die man achten sollte.

    – Jakob P.

    28. Juni 2012 um 7:49 Uhr

  • Ich bin neugierig, welche Art von Funktionalität diese Methoden ausführen. Vielleicht wurde etwas nicht ganz richtig gemacht, wenn es so viele davon gibt.

    – ArjunShankar

    28. Juni 2012 um 7:50 Uhr

  • Siehe auch: stackoverflow.com/q/790281

    – Brian Rasmussen

    3. Juli 2012 um 16:47 Uhr

  • Ich hatte eine ähnliche Frage und keiner der Kommentare hat die Antwort wirklich eloquent gesagt. Private macht Methoden für andere Klassen unzugänglich (selbst wenn Sie sie erweitern). Mit Static können Sie Methoden erstellen, die sich nicht ändern (abgeschlossen sind). Wenn Sie also einer anderen Klasse Methoden geben möchten, aber nicht möchten, dass sie sich ändern, machen Sie daraus eine öffentliche statische Methode. Wenn Sie Eingaben als Argumente akzeptieren, machen Sie sie NICHT statisch.

    – Evan Erickson

    21. Dezember 2021 um 18:10 Uhr

  • Wenn eine Methode statisch ist, können Sie sie auch einfach mit methodName(); referenzieren; in Ihrer neuen Klasse, die die alte Klasse erweitert. Sie müssen className.methodName() nicht wie bei nicht statischen Methoden einfügen.

    – Evan Erickson

    21. Dezember 2021 um 18:10 Uhr

Benutzer-Avatar
Samuel Rossille

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

Wenn eine Methode statisch ist, können Sie nicht auf nicht statische Member zugreifen; Daher ist Ihr Anwendungsbereich enger. Also, wenn Sie es nicht brauchen und nie brauchen (auch nicht in Unterklassen) nicht-statische Mitglieder, um Ihren Vertrag zu erfüllen, warum geben Sie Ihrer Methode Zugriff auf diese Felder? Deklaration der Methode static In diesem Fall lässt der Compiler überprüfen, dass Sie keine Mitglieder verwenden, die Sie nicht verwenden möchten.

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

Deshalb wird es als gut angesehen, eine Methode zu deklarieren static wenn es tatsächlich einen statischen Vertrag implementiert.

In einigen Fällen bedeutet Ihre Methode nur etwas relativ zu einer Instanz Ihrer Klasse, und es kommt vor, dass ihre Implementierung kein nicht statisches Feld oder keine Instanz verwendet. In solchen Fällen würden Sie die Methode nicht markieren static.

Beispiele dafür, wo Sie die nicht verwenden würden static Stichwort:

  • Ein Erweiterungs-Hook, der nichts tut (aber etwas mit Instanzdaten in einer Unterklasse tun könnte)
  • Ein sehr einfaches Standardverhalten, das in einer Unterklasse anpassbar sein soll.
  • Event-Handler-Implementierung: Die Implementierung variiert mit der Klasse des Event-Handlers, verwendet jedoch keine Eigenschaft der Event-Handler-Instanz.

  • +1 Es geht darum, die Möglichkeiten zu minimieren, sich selbst in den Fuß zu schießen, und zu reduzieren, wie viel Sie wissen müssen, um eine Methode zu verstehen.

    – Peter Lawrey

    28. Juni 2012 um 7:52 Uhr

  • Außerdem müssen Sie sich nicht mit dem Erwerb einer Instanz herumschlagen, nur um eine unabhängige, in sich geschlossene Funktion aufzurufen.

    – Marko Topolnik

    28. Juni 2012 um 7:56 Uhr

  • In anderen Welten sollte also jede Methode, die keine Instanzvariablen verwendet, als statisch deklariert werden? Ich dachte immer, dass Methoden nur dann statisch sein sollten, wenn dies wünschenswert ist (wie Dienstprogrammmethoden).

    – Peter Mensik

    28. Juni 2012 um 8:18 Uhr

  • @PetrMensik Wenn a private Methode statisch deklariert werden könnte, dann ist es fast immer so sollte sein. Für jede andere Zugriffsebene müssen andere Faktoren berücksichtigt werden, z. B. der dynamische Versand.

    – Marko Topolnik

    28. Juni 2012 um 8:19 Uhr


  • @JamesPoulson Ich meine den Versand dynamischer Methoden, die Sache, die während der Ausführung passiert object.method() um die aufzurufende Methode auszuwählen.

    – Marko Topolnik

    28. Juni 2012 um 10:03 Uhr

Benutzer-Avatar
Jack

Hier gibt es kein Konzept mit Optimierung.

EIN static Methode ist static weil Sie explizit deklarieren, dass sich die Methode nicht auf eine Instanz der einschließenden Klasse verlässt, nur weil dies nicht erforderlich ist. Damit die Eclipse-Warnung, wie in der Dokumentation angegeben:

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.

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, es eine normale Methode zu sein, anstatt eine statische. Eine statische Methode ist von Natur aus sicherer, auch weil Sie weniger Dinge damit tun dürfen (sie benötigt keine Instanz, Sie haben keine impliziten this Objekt).

Benutzer-Avatar
Istvan Devai

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 das Umgestalten in statische Methoden ist jedoch, dass die Verwendung von statischen Methoden derzeit als schlechte Praxis angesehen wird. Statische Methoden / Variablen lassen sich nicht gut in eine objektorientierte Sprache integrieren und sind auch schwer richtig zu testen. Das ist der Grund, warum einige neuere Sprachen ganz auf das Konzept statischer Methoden/Variablen verzichten oder versuchen, es auf eine Weise in die Sprache zu verinnerlichen, die besser mit OO zusammenpasst (z. B. Objekte in Scala).

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

  • Statische Methoden sind trivial zu testen (solange sie in sich geschlossen sind – insbesondere reine Funktionen, die das primäre Ziel einer statischen Methode sind). Da hat das OO-Konzept nichts zu bieten. Außerdem hat das Konzept einer erstklassigen Funktion, wenn überhaupt, sehr wenig mit dem Konzept einer statischen Methode zu tun. Wenn Sie jemals eine erstklassige Funktion benötigen, die die Arbeit einer vorhandenen statischen Methode erledigt, ist es eine Frage einer Handvoll Zeichen, sie zu implementieren.

    – Marko Topolnik

    28. Juni 2012 um 10:21 Uhr


  • Die Bemerkung zur Testbarkeit war wahrscheinlich nicht direkt auf die statische Methode ausgerichtet, aber statische Methoden sind viel schwieriger zu verspotten, sodass sie das Testen von Methoden erschweren, die statische Methoden aufrufen.

    – Buhb

    28. Juni 2012 um 10:32 Uhr

  • Statische Methoden lassen sich leicht verspotten, wenn Sie ein leistungsstarkes Verspottungs-Framework wie verwenden JMockit, PowerMockoder Groovig.

    – Jeff Olson

    6. Juli 2012 um 3:24 Uhr


  • Diese sind private static Methoden, damit Sie sie nicht verspotten müssen

    – Blundell

    9. Juli 2012 um 20:45 Uhr

Benutzer-Avatar
FooF

1. Deklarationsmethode static gibt einen leichten Leistungsvorteil, aber was noch nützlicher ist, ermöglicht es, es zu verwenden, ohne eine Objektinstanz zur Hand zu haben (denken Sie zum Beispiel an die Factory-Methode oder das Erhalten eines Singletons). 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 Denkwerkzeug für den ursprünglichen Programmierer dient – es hilft, die beabsichtigte Bedeutung explizit zu machen Sie denken auch klar und produzieren qualitativ besseren Code (ich denke, basierend auf meiner persönlichen Erfahrung, aber Menschen sind unterschiedlich). Beispielsweise ist es logisch und daher wünschenswert, zwischen Methoden zu unterscheiden, die mit einem Typ arbeiten, und Methoden, die mit einer Instanz des Typs arbeiten (wie von Jon Skeet in seinem Kommentar zu einer C#-Frage ausgeführt).

Ein weiterer Anwendungsfall für static Methoden besteht darin, prozedurale Programmierschnittstellen nachzuahmen. Denk an java.lang.System.println() Klasse und die darin enthaltenen Methoden und Attribute. Die Klasse java.lang.System wird eher wie ein Gruppierungsnamensraum als wie ein instanziierbares Objekt verwendet.

2. Wie kann Eclipse (oder jede andere programmierte oder andere Art von – biologisch abbaubarer oder nicht biologisch abbaubarer – Entität) sicher wissen, welche Methode als statisch deklariert werden könnte? Selbst wenn eine Basisklasse nicht auf Instanzvariablen zugreift oder nichtstatische Methoden aufruft, können sich die Dinge durch den Vererbungsmechanismus ändern. Nur wenn die Methode nicht durch erbende Unterklassen überschrieben werden kann, können wir mit 100%iger Sicherheit behaupten, dass die Methode wirklich deklariert werden kann static. Das Aufheben einer Methode ist genau in den beiden Seinsfällen unmöglich

  1. private (keine Unterklasse kann es direkt verwenden und weiß nicht einmal im Prinzip davon), oder
  2. final (Selbst wenn die Unterklasse darauf zugreifen kann, gibt es keine Möglichkeit, die Methode so zu ändern, dass sie auf Instanzdaten oder Funktionen verweist).

Daher die Logik der Eclipse-Option.

3. Das Originalplakat fragt auch: „Auf eine Methode als statisch hinzuweisen, zeigt wohl, dass Sie keine Instanzvariablen verwenden und daher in eine Klasse im utils-Stil verschoben werden könnten?” Dies ist ein sehr guter Punkt. Manchmal wird diese Art von Designänderung durch die Warnung angezeigt.

Es ist eine sehr nützliche Option, die ich persönlich aktivieren würde, wenn ich Eclipse verwenden und in Java programmieren würde.

Siehe Samuels Antwort, wie sich der Geltungsbereich der Methode ändert. Ich denke, das ist der Hauptaspekt, eine Methode statisch zu machen.

Sie haben auch nach der Leistung gefragt:

Es kann einen kleinen Leistungsgewinn geben, da ein Aufruf einer statischen Methode die implizite “this”-Referenz nicht als Parameter benötigt.

Diese Auswirkungen auf die Leistung sind jedoch wirklich gering. Daher kommt es auf den Umfang an.

Benutzer-Avatar
Blundell

Aus den Android-Leistungsrichtlinien:

Bevorzugen Sie statische statt virtuelle Wenn Sie nicht auf die Felder eines Objekts zugreifen müssen, machen Sie Ihre Methode statisch. Aufrufe werden etwa 15 % bis 20 % schneller sein. Es ist auch eine bewährte Vorgehensweise, da Sie anhand der Methodensignatur erkennen können, dass das Aufrufen der Methode den Zustand des Objekts nicht ändern kann.

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

Benutzer-Avatar
Edwin Dalorzo

Nun, die Eclipse-Dokumentation sagt über die fragliche Warnung:

Die Methode kann statisch sein

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

Ich denke, es sagt so ziemlich alles. Wenn die Methode privat und final ist und sich nur auf statische Member bezieht, kann die betreffende Methode genauso gut als statisch deklariert werden und dadurch deutlich machen, dass wir nur auf statische Inhalte von ihr zugreifen wollen.

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

1283000cookie-checkWas bringt es, eine Methode als statisch zu deklarieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy