Ich möchte die Frage stellen, wann es vorteilhaft wäre, statische Variablen / Methoden zu verwenden, oder in anderen Fällen Instanzvariablen / Methoden in Java?
Ich weiß, dass es auf den bestimmten Fall ankommt (wie util-classes als statische Methoden zu programmieren), aber können wir etwas wie eine allgemeine Strategie deklarieren?
Auf der Anfängerstufe:
Verwenden Sie Instanzvariablen, wenn: Jede Variable einen anderen Wert für ein anderes Objekt hat. ZB: Name des Schülers, Rollennummer etc ..
Verwenden Sie statische Variablen, wenn: Der Wert der Variablen ist unabhängig von den Objekten (nicht für jedes Objekt eindeutig). ZB: Nein von Studenten.
Statische Variable: Wenn Sie etwas benötigen, das während der gesamten Anwendung verwendet wird und jede Instanz die Variable kennen muss.
Instanzvariable: Sie unterscheidet sich von Objekt zu Objekt und Eigenschaft des Objekts, während die statische Variable die Eigenschaft der Klasse ist.
Statische Funktion: Wird verwendet, um einige Utility-Aufgaben auszuführen. Kann ohne Objektdeklaration aufgerufen werden.
Instanzfunktion: Benötigt ein Objekt, um diese Funktion aufzurufen.
statisch oder Instanz hängt von Ihren Anwendungen ab.
static
Variablen werden oft für Konstanten verwendet, was allen Instanzen der Klasse gemeinsam ist. Zum Beispiel mögen viele Leute keine "Hard-Code" -Konstanten in ihrem Code; Sie möchten eine Variable public static
oder private static
mit einem aussagekräftigen Namen versehen und diese in ihrem Code verwenden, wodurch der Code lesbarer wird.
Kurz gesagt
Jede Methode oder Variable, die unabhängig vom Status einer Instanz der Klasse ist, sollte statisch sein .
Stellen Sie sich statische Variablen als globale Variablen für die gesamte Klasse vor oder, wenn Sie das Schlüsselwort final verwenden, als globale Konstanten für die gesamte Klasse. Verwenden Sie statische nicht-finale Variablen mit Bedacht - sie werden von allen Klasseninstanzen gemeinsam genutzt und können zu nicht offensichtlichen Fehlern führen. Ich würde empfehlen, überhaupt keine veränderlichen statischen Variablen zu verwenden - es gibt kleine bis keine Fälle, in denen ein solcher Bedarf nicht durch die Abhängigkeitsinjektion implementiert werden könnte.
Auch die Verwendung von Globals macht Unit-Testing Lot immer schwieriger - ein weiterer Nachteil, den es zu beachten gilt.
Wie für Methoden: Jede Methode Foo.method (Bar1 b1, Bar2, b2) könnte per Definition immer alternative äquivalente Designs haben:
Bar.altmethod (Foo f, Bar b2)
und
statische Methode (Foo f, Balken b1, Balken b2)
Und Sie könnten diese letztere Methode auch als eine Intsance-Methode in eine Serviceklasse einbinden, die selbst ein Singleton ist (so dass die Statik der Methode ein wenig von der Klasse verdeckt wird, in der sie sich befindet).
>Der einzige überzeugende Grund, Ihre Methode als Instanzmethode der Klasse eines Ihrer Methodenargumente (der statischen Version) zu verwenden, ist, wenn Sie erwarten, dass es Unterklassen für diese Klasse gibt. und dass es für diese Unterklassen nützlich sein könnte, eine spezielle Implementierung der Methode zu haben.
Stellen Sie sich vor
Klasse GeographicalFigure {Objektquadratur () {...}}
Es könnte nützlich sein, die Möglichkeit des späteren Hinzufügens von
offen zu lassenclass Kreis erweitert GeographicalFigure {Objektquadratur () {neue werfen ThisIsNoGoodException (); }}
Abgesehen davon sind alle Ihre Optionen im Wesentlichen gleichwertig.