2014-01-16 3 views
7

Ich möchte die Frage stellen, wenn es vorteilhaft wäre, statische Variablen/Methoden oder in anderen Fall Instanzvariablen/Methoden in Java zu verwenden?Wann statische Variablen/Methoden verwendet werden sollen und wann Instanzvariablen/Methoden in Java verwendet werden sollen?

Ich weiß, dass es auf den bestimmten Fall abhängt (wie util-Klassen als statische Methoden zu programmieren), aber können wir etwas wie eine allgemeine Strategie erklären?

+3

[Klicken Sie auf mich] (http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html). – Maroun

+0

Überprüfen Sie Folgendes: [Statisches Schlüsselwort in Java] (http://programmergate.com/static-keyword-java/) –

Antwort

12

Auf Anfänger Ebene:

Verwenden Instanzvariablen, wenn: Jede Variable einen anderen Wert für unterschiedliches Objekt hat. ZB: Name des Schülers, Rollennummer usw.

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.

3

static Variablen werden oft für Konstanten verwendet, die allen Instanzen der Klasse gemeinsam ist. Zum Beispiel mögen viele Leute keine "Hard-Code" -Konstanten in ihrem Code; sie mögen es, eine public static oder private static Variable mit einem aussagekräftigen Namen zu machen und das in ihrem Code zu verwenden, der den Code lesbarer machen sollte.

Im Kurzen

ein beliebiges Verfahren oder eine Variable, die von dem Zustand einer Instanz der Klasse unabhängig ist, sollte statisch sein.

4

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.

statische oder Instanz hängt von Ihren Anwendungen ab.

1

Denken Sie an statische Variablen als klassenweite globale Variablen oder, wenn Sie das Schlüsselwort "final" verwenden, als klassenweite globale Konstanten. 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 solche Bedürfnisse nicht durch Dependency-Injection implementiert werden könnten.

Auch die Verwendung von Globals macht Unit-Testing-Lot immer schwieriger - ein weiterer Nachteil zu beachten.

0

Wie für Verfahren: jede Methode Foo.method (Bar1 b1, Bar2, b2) definitions könnte immer alternative äquivalente Ausführungen:

Bar.altmethod (Foo f, Bar b2)

und

statische static (Foo f, Bar b1, Bar b2)

Und Sie auch, dass letztere Methode als intsance Verfahren in einer Serviceklasse, die ein Singleton selbst (so dass die statische-ness des Verfahrens wickeln könnten ist ein bisschen versteckt von der Cla ss es ist in).

Die einzige zwingende Grund, Ihre Methode als eine Instanzmethode der Klasse eines Ihrer Methodenargumente (der statischen Version) zu haben, ist, wenn Sie dort Unterklassen für diese Klasse erwarten, und das könnte nützlich für diese Unterklassen sein, um eine spezialisierte Implementierung der Methode zu haben.

Klasse GeographicalFigure {Object Quadratur() {...}} Stellen Sie sich vor

es sinnvoll sein könnte, die Möglichkeit offen zu lassen späterer

Klasse Kreis Zusatz erweitert GeographicalFigure {Object Quadratur() {neue werfen ThisIsNoGoodException(); }}

Ansonsten sind alle Ihre Optionen im Wesentlichen gleichwertig.