Eine Faustregel: Fragen Sie sich: "Ist es sinnvoll, diese Methode aufzurufen, auch wenn noch kein Objekt erstellt wurde?" Wenn ja, sollte es definitiv statisch sein.
In einer Klasse haben Car
Sie möglicherweise eine Methode:
double convertMpgToKpl(double mpg)
... was statisch wäre, weil man vielleicht wissen möchte, in was 35mpg konvertiert, selbst wenn noch niemand ein gebaut hat Car
. Aber diese Methode (die die Effizienz einer bestimmten festlegt Car
):
void setMileage(double mpg)
... kann nicht statisch sein, da es unvorstellbar ist, die Methode aufzurufen, bevor eine erstellt Car
wurde.
(Übrigens ist das Gegenteil nicht immer der Fall: Manchmal haben Sie eine Methode, die zwei Car
Objekte umfasst, und möchten dennoch, dass sie statisch ist. ZB:
Car theMoreEfficientOf( Car c1, Car c2 )
Obwohl dies in eine nicht statische Version konvertiert werden könnte, würden einige argumentieren, dass Car
Sie einen Anrufer nicht zwingen sollten, eine Car
als das Objekt auszuwählen, das Sie aufrufen , da es keine "privilegierte" Auswahl gibt, die wichtiger ist Methode auf. Diese Situation macht jedoch einen relativ kleinen Teil aller statischen Methoden aus.)
Car#isMoreEfficientThan(Car)
. Es hat den Vorteil, dass das Auto, das Sie bei einem Unentschieden zurückgeben, nicht willkürlich ist. Aus dem Titel der Methode geht hervor, was bei einem Unentschieden zurückgegeben wird.Definieren Sie statische Methoden nur in den folgenden Szenarien:
quelle
Es gibt einige triftige Gründe für die Verwendung statischer Methoden:
Leistung : Wenn Sie möchten, dass Code ausgeführt wird, und kein zusätzliches Objekt dafür instanziieren möchten, verschieben Sie ihn in eine statische Methode. Die JVM kann auch statische Methoden stark optimieren (ich glaube, ich habe einmal James Gosling gelesen, der erklärt, dass Sie keine benutzerdefinierten Anweisungen in der JVM benötigen, da statische Methoden genauso schnell sind, aber die Quelle nicht finden konnten - also es könnte völlig falsch sein). Ja, es ist eine Mikrooptimierung und wahrscheinlich nicht erforderlich. Und wir Programmierer machen niemals unnötige Dinge, nur weil sie cool sind, oder?
Praktikabilität : Anstatt
new Util().method(arg)
anzurufenUtil.method(arg)
, anzurufen odermethod(arg)
statisch zu importieren. Einfacher, kürzer.Hinzufügen von Methoden : Sie wollten wirklich, dass die Klasse String eine
removeSpecialChars()
Instanzmethode hat, diese ist jedoch nicht vorhanden (und sollte es auch nicht sein, da sich die Sonderzeichen Ihres Projekts möglicherweise von denen der anderen Projekte unterscheiden), und Sie können sie nicht hinzufügen (seit Java) ist etwas vernünftig), also erstellen Sie eine Utility-Klasse und rufenremoveSpecialChars(s)
stattdessen aufs.removeSpecialChars()
. Süss.Reinheit : Wenn Sie einige Vorsichtsmaßnahmen treffen, ist Ihre statische Methode eine reine Funktion , das heißt, das einzige, von dem sie abhängt, sind ihre Parameter. Daten rein, Daten raus. Dies ist einfacher zu lesen und zu debuggen, da Sie keine Vererbungsprobleme haben, über die Sie sich Sorgen machen müssen. Sie können dies auch mit Instanzmethoden tun, aber der Compiler hilft Ihnen ein wenig mehr mit statischen Methoden (indem er keine Verweise auf Instanzattribute, überschreibende Methoden usw. zulässt).
Sie müssen auch eine statische Methode erstellen, wenn Sie einen Singleton erstellen möchten, aber ... nicht. Ich meine, überleg es dir zweimal.
Was noch wichtiger ist: Warum möchten Sie keine statische Methode erstellen? Grundsätzlich geht der Polymorphismus aus dem Fenster . Sie können die Methode
wederüberschreibennoch in einer Schnittstelle(vor Java 8)deklarieren. Ihr Design nimmt viel Flexibilität in Anspruch. Wenn Sie einen Status benötigen, treten außerdem viele Parallelitätsfehler und / oder Engpässe auf, wenn Sie nicht vorsichtig sind.quelle
Nach dem Lesen von Miskos Artikeln glaube ich, dass statische Methoden unter Testgesichtspunkten schlecht sind. Sie sollten stattdessen Fabriken haben (möglicherweise mit einem Tool zur Abhängigkeitsinjektion wie Guice ).
Wie stelle ich sicher, dass ich nur eines von etwas habe?
Das grundlegende Problem bei statischen Methoden ist, dass es sich um prozeduralen Code handelt
quelle
Math.abs()
oderArrays.sort()
sogar Methoden testen , an die Sie alle Abhängigkeiten übergeben können , sehe ich nicht, wie dies jemals das Testen von Einheiten behindern würde. Ich würde sagen, eine einfache Faustregel lautet: Wenn Sie jemals einen Grund haben würden, die prozedurale Logik zu verspotten, dann setzen Sie sie nicht in eine statische Methode. Ich hatte noch nie einen Grund, mich lustig zu machenArrays.sort()
oderMath.abs()
.Eine
static
Methode ist eine Art von Methode, für deren Aufruf kein Objekt initialisiert werden muss. Haben Sie bemerktstatic
, dass in dermain
Funktion in Java verwendet wird? Von dort aus beginnt die Programmausführung, ohne dass ein Objekt erstellt wird.Betrachten Sie das folgende Beispiel:
quelle
Statische Methoden in Java gehören zur Klasse (keine Instanz davon). Sie verwenden keine Instanzvariablen und nehmen normalerweise Eingaben von den Parametern entgegen, führen Aktionen dafür aus und geben dann ein Ergebnis zurück. Instanzmethoden sind Objekten zugeordnet und können, wie der Name schon sagt, Instanzvariablen verwenden.
quelle
Nein, statische Methoden sind keiner Instanz zugeordnet. Sie gehören zur Klasse. Statische Methoden sind Ihr zweites Beispiel. Instanzmethoden sind die ersten.
quelle
Wenn Sie ein statisches Schlüsselwort mit einer Methode anwenden, wird dies als statische Methode bezeichnet.
// Programm zum Ändern der gemeinsamen Eigenschaft aller Objekte (statisches Feld).
O / P: 111 indische BBDIT 222 amerikanische BBDIT 333 China BBDIT
quelle
Statische Methoden sind keiner Instanz zugeordnet, sodass sie nicht auf nicht statische Felder in der Klasse zugreifen können.
Sie würden eine statische Methode verwenden, wenn die Methode keine Felder (oder nur statische Felder) einer Klasse verwendet.
Wenn nicht statische Felder einer Klasse verwendet werden, müssen Sie eine nicht statische Methode verwenden.
quelle
Statische Methoden sollten für die Klasse aufgerufen werden, Instanzmethoden sollten für die Instanzen der Klasse aufgerufen werden. Aber was bedeutet das in Wirklichkeit? Hier ist ein nützliches Beispiel:
Eine Fahrzeugklasse verfügt möglicherweise über eine Instanzmethode namens Accelerate (). Sie können ein Auto nur beschleunigen, wenn das Auto tatsächlich existiert (konstruiert wurde) und dies daher eine Instanzmethode wäre.
Eine Fahrzeugklasse verfügt möglicherweise auch über eine Zählmethode namens GetCarCount (). Dies würde die Gesamtzahl der erstellten (oder gebauten) Autos zurückgeben. Wenn keine Autos gebaut worden wären, würde diese Methode 0 zurückgeben, sollte aber dennoch aufgerufen werden können, und daher müsste es sich um eine statische Methode handeln.
quelle
Tatsächlich verwenden wir statische Eigenschaften und Methoden in einer Klasse, wenn wir einen Teil unseres Programms verwenden möchten, der dort vorhanden sein sollte, bis unser Programm ausgeführt wird. Und wir wissen, dass wir zur Manipulation statischer Eigenschaften statische Methoden benötigen, da diese nicht Teil der Instanzvariablen sind. Und ohne statische Methoden ist das Manipulieren statischer Eigenschaften zeitaufwändig.
quelle
Verwenden Sie eine statische Methode, wenn Sie ohne Instanz der Klasse auf die Methode zugreifen möchten.
quelle
Statisch:
Obj.someMethod
Verwenden
static
Sie diese Option, wenn Sie Zugriff auf Klassenebene auf eine Methode gewähren möchten, dh wenn die Methode ohne eine Instanz der Klasse aufgerufen werden soll.quelle
Statische Methoden müssen nicht für das Objekt aufgerufen werden, und dann verwenden Sie es. Beispiel: Ihr Main () ist statisch und Sie erstellen kein Objekt, um es aufzurufen.
quelle
Statische Methoden und Variablen sind kontrollierte Versionen von 'globalen' Funktionen und Variablen in Java. Auf welche Methoden als
classname.methodName()
oder zugegriffen werden kannclassInstanceName.methodName()
, dh auf statische Methoden und Variablen kann unter Verwendung des Klassennamens sowie von Instanzen der Klasse zugegriffen werden.Klasse kann nicht als statisch deklariert werden (da dies keinen Sinn ergibt. Wenn eine Klasse als öffentlich deklariert wird, kann von überall auf sie zugegriffen werden), können innere Klassen als statisch deklariert werden.
quelle
Statische Methoden können verwendet werden, wenn
Man möchte keine Aktion für eine Instanz ausführen (Dienstprogrammmethoden)
Man möchte als einfache Funktion verwenden. Eingaben werden explizit übergeben und die Ergebnisdaten als Rückgabewert abgerufen. Vererbung, Objektinstanziierung kommt nicht ins Bild. Prägnant, lesbar .
HINWEIS : Nur wenige Leute sprechen sich gegen die Testbarkeit statischer Methoden aus, aber auch statische Methoden können getestet werden! Mit jMockit kann man statische Methoden verspotten. Testbarkeit . Beispiel unten:
quelle
Statische Methoden sind die Methoden in Java, die aufgerufen werden können, ohne ein Klassenobjekt zu erstellen. Es gehört zur Klasse.
Wir verwenden eine statische Methode, wenn die Methode nicht mithilfe einer Instanz aufgerufen werden muss.
quelle
static
Methoden ist der Zugriff aufstatic
Felder.Sie können jedoch
static
Methoden verwenden, ohne aufstatic
Variablen zu verweisen . Hilfsmethoden ohne referenzierendestatic
Variable finden Sie in einigen Java-Klassen wie java.lang.MathDer andere Anwendungsfall, den ich mir vorstellen kann,
synchronized
ist die Implementierung der Sperrung auf Klassenebene in einer Umgebung mit mehreren Threads.Wenn Sie auf eine Methode für ein Instanzobjekt der Klasse zugreifen müssen, sollte Ihre Methode nicht statisch sein.
Oracle - Dokumentation Seite liefert weitere Informationen.
Nicht alle Kombinationen von Instanz- und Klassenvariablen und -methoden sind zulässig:
quelle
A common use for static methods is to access static fields.
kein Argument.Eine statische Methode hat zwei Hauptziele:
quelle
In Eclipse können Sie eine Warnung aktivieren, mit der Sie potenzielle statische Methoden erkennen können. (Über der hervorgehobenen Linie befindet sich eine weitere, die ich vergessen habe hervorzuheben)
quelle
Wenn Sie kein Objekt zum Aufrufen einer Methode in Ihrem Code erstellen möchten, deklarieren Sie diese Methode einfach als statisch. Da für die statische Methode keine Instanz aufgerufen werden muss, aber der Haken hier ist, werden nicht alle statischen Methoden von JVM automatisch aufgerufen. Dieses Privileg wird nur von der main () -Methode "public static void main [String ... args]" in Java genutzt, da dies zur Laufzeit die von JVM als Einstiegspunkt gesuchte Methode Signature public "static" void main [] ist Starten Sie die Ausführung des Codes.
Beispiel:
Ausgabe: - Diese statische Methode wird von JVM ausgeführt. Diese statische Methode muss explizit aufgerufen werden. Diese statische Methode muss explizit aufgerufen werden. Diese statische Methode muss explizit aufgerufen werden
quelle