2012-04-10 5 views
4

Zunächst ist dies kein exaktes Duplikat von Initialize final variable before constructor in Java. Es ist wahrscheinlich verwandt, aber es gibt keine Antworten, die mich befriedigen.endgültige Variablenzuweisung: bei der Deklaration oder im Konstruktor?

Mein Problem ist über endgültige Variablen in Swing GUI's. Es geht um benutzerdefinierte Action s insbesondere. Ich habe eine Anzahl von final Variablen und eine Anzahl von static final Variablen.

Die Frage ist: Wenn die Variable tatsächlich eine Konstante ist, was ist besser: sie zur Konstruktionszeit initialisieren oder bei Deklaration initialisieren?

Die Antworten auf die Frage, die ich oben erwähnt habe, weisen generell darauf hin, dass die Variable static erstellt wird, sobald Sie sie bei der Deklaration zuweisen können. Das macht für mich keinen Sinn, da die Variablen nicht in einem statischen Kontext verwendet werden. Ich habe ein paar Bilder, die mein Formular wie Symbole verwendet, ich habe diese statisch gemacht, weil ein Bild einfach eine statische Sache ist, es sei denn, Ihre Anwendung modifiziert sie. Das macht Sinn.

Auf der anderen Seite sind die Action s neue Instanzen einer benutzerdefinierten inneren Klasse. Sehr technisch sind sie auch statisch, aber es fühlt sich einfach anders an. Sie müssen einfach nicht im statischen Kontext imo verfügbar sein. Also setze ich:

private final CustomAction customAction = new CustomAction(); 

Oder initialisiere ich es im Konstruktor? Welches ist besser? Oder denke ich den falschen Weg über static?

+0

+1 für Ihre Forschung im Voraus –

+1

Wenn Sie den Wert kennen, wenn Sie Code bei der Deklaration initialisieren. Sonst beim Aufbau. – titogeo

Antwort

5

Wenn das Feld eine Konstante ist, macht es zu einem static final Mitglied der Klasse,

public class Foo{ 
    public static final int BAR = ...; 
} 

Andernfalls initialisieren das Feld in dem Konstruktor.

+1

Sie sind die _n_ th Person, die das sagt, obwohl niemand jemals genau warum gesagt hat oder diesen Ansatz gerechtfertigt hat. – MarioDS

+1

@MarioDeSchaepmeester, siehe [dies] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html). – mre

+4

@MarioDeSchaepmeester Wenn es konstant ist, warum es jedes Mal neu initialisieren, wenn Sie den Konstruktor aufrufen? Es gibt eine Vielzahl von Rechtfertigungen, und die Link-Mute-Post ist ein guter Anfang. – darrengorman

1

Initialisieren Sie Ihre konstanten Variablen bei der Deklaration: es ist lesbarer. Machen Sie es statisch, wenn es nicht sinnvoll ist, für verschiedene Instanzen der Klasse unterschiedliche Werte einzugeben, das heißt, wenn es sich um eine Variable auf Klassenebene und nicht um eine Instanzenebene handelt.

0

Für eine schnelle Anwendung starten und Programmteile der Benutzer möglicherweise nicht besuchen (Über Dialog), statische ist nicht gut. Im Allgemeinen ist statisch nicht sehr beliebt, wie Sie herausgefunden haben. Es gibt einige Gründe, aber nichts sehr überzeugend. Aber manchmal ist es ein Anti-Muster oder ein Zeichen dafür.

Noch in Ihrem Fall würde ich von statischen Bildern Abstand nehmen. Übrigens werden Ressourcen intern zwischengespeichert.

+1

Das ist ziemlich verwirrend ... wenn Ihre Anwendung eine Reihe von Bildern benötigt, die über die Laufzeit der Anwendung konstant bleiben (zB wenn ich eine Toolbar habe, die einige Male in meiner Anwendung erscheint, aber alle Icons in ihren Buttons enthält)), warum laden Sie sie nicht statisch? – CodeBlind

+0

Eine Symbolleiste, die sofort sichtbar ist, ja. Natürlich würde es hier egal sein, ob statisch erstellt oder bei der Erstellung der Symbolleiste. –

1

Ich denke, Sie sind auf dem richtigen Weg, es nicht statisch zu machen, weil es klingt wie Ihre CustomAction Objekte sind wirklich benutzerdefinierte auf die Instanz der GUI, die sie in seinem Konstruktor erstellt. Ich denke, ob Sie es im Konstruktor initialisieren oder nicht, hängt davon ab, ob Ihr Konstruktor eine CustomAction auf Basis der Eingabeargumente des Konstruktors anders initialisieren könnte.

Wo static im Vergleich zu nicht-statischen betrifft ... eine gute Faustregel ist, wenn eine Variable über alle Instanzen eines bestimmten Objekttyps konstant bleiben soll, dann sollte diese Variable static sein. Diese spart Speicher über die Laufzeit Ihres Programms und spart CPU-Zeit, wenn jede Objektinstanz erstellt wird, da diese Konstante nicht jedes Mal initialisiert werden muss, wenn Sie eine neue Instanz Ihres Objekts erstellen.Wenn andererseits eine Variable für eine bestimmte Instanz eines Objekts konstant bleibt, sich jedoch von Instanz zu Instanz unterscheiden kann, sollte sie nicht statisch sein.

Schließlich sollte final immer verwendet werden, wenn Sie nicht möchten, dass sich ein primitiver Wert oder eine Referenz auf ein Objekt jemals ändert. Der statische oder nicht statische Kontext beeinflusst nicht wirklich, ob eine Variable final sein sollte, es ist streng genommen final, weil der Entwickler diese Variable niemals ändern möchte. Der statische Kontext hängt ausschließlich davon ab, wie der Entwickler darauf zugreifen möchte.

Verwandte Themen