4 Stimmen

Finale Variablzuweisung: bei Deklaration oder im Konstruktor?

Zunächst einmal ist dies KEIN exakter Duplikat von Endgültige Variable vor Konstruktor in Java initialisieren. Es ist wahrscheinlich verwandt, aber es gibt keine Antworten, die mich zufriedenstellen.

Mein Problem betrifft endgültige Variablen in Swing-GUIs. Es geht insbesondere um benutzerdefinierte Actions. 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 der Deklaration initialisieren?

Die Antworten auf die oben genannte Frage tendieren im Allgemeinen dazu, die Variable static zu machen, sobald Sie sie bei der Deklaration zuweisen können. Das ergibt für mich nicht wirklich 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.

Andererseits sind die Actions neue Instanzen einer benutzerdefinierten inneren Klasse. Technisch gesehen sind sie auch statisch, aber es fühlt sich einfach anders an. Sie dürfen einfach nicht im statischen Kontext verfügbar sein meiner Meinung nach. Setzte ich also:

private final CustomAction customAction = new CustomAction();

Oder initialisiere ich es im Konstruktor? Was ist besser? Oder denke ich falsch über static nach?

5voto

mre Punkte 42210

Wenn das Feld eine Konstante ist, machen Sie es zu einem static final Element der Klasse,

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

Andernfalls initialisieren Sie das Feld im Konstruktor.

1voto

bpgergo Punkte 15135

Initialisieren Sie Ihre Konstanten Variablen bei der Deklaration: es ist lesbarer. Machen Sie es statisch, wenn es keinen Sinn ergibt, unterschiedliche Werte dafür für verschiedene Instanzen der Klasse zu setzen, das heißt, wenn es eine Klassenvariablen ist, nicht eine Instanzvariablen.

1voto

CodeBlind Punkte 4451

Ich denke, du bist auf dem richtigen Weg, indem du es nicht statisch machst, denn es scheint so, als ob deine CustomAction-Objekte wirklich benutzerdefiniert für die Instanz des GUI sind, die sie in ihrem Konstruktor erstellt. Ich denke, ob du es im Konstruktor initialisierst oder nicht, hängt davon ab, ob dein Konstruktor eine CustomAction unterschiedlich initialisieren könnte, basierend auf den Eingangsargumenten des Konstruktors.

Was static versus nicht-statisch betrifft... eine gute Faustregel ist, wenn eine Variable über alle Instanzen eines bestimmten Objekttyps konstant bleibt, sollte diese Variable static sein. Das spart Speicherplatz während der Laufzeit deines Programms und sparst auch CPU-Zeit, wenn jede Objektinstanz konstruiert wird, da diese Konstante nicht jedes Mal initialisiert werden muss, wenn du eine neue Instanz deines Objekts erstellst. Andererseits, wenn eine Variable für eine bestimmte Instanz eines Objekts konstant bleiben, aber von Instanz zu Instanz unterschiedlich sein soll, sollte sie nicht statisch sein.

Zu guter Letzt (Wortspiel beabsichtigt), final sollte verwendet werden, wenn du nicht möchtest, dass ein primitiver Wert oder eine Referenz auf ein Objekt jemals geändert wird. Der statische oder nicht-statische Kontext beeinflusst nicht wirklich, ob eine Variable final sein sollte, sie ist streng final, weil der Entwickler diese Variable niemals ändern möchte. Ihr statischer Kontext hängt allein davon ab, wie der Entwickler möchte, dass sie zugegriffen wird.

0voto

Joop Eggen Punkte 101784

Für einen schnellen Anwendungsstart und Programmteile, die der Benutzer möglicherweise nicht besucht (Info-Dialog), ist Static nicht gut. Im Allgemeinen wird Static nicht sehr gemocht, wie Sie herausgefunden haben. Es gibt einige Gründe, aber nichts sehr überzeugendes. Manchmal ist es jedoch ein Anti-Pattern oder ein Zeichen dafür.

In Ihrem Fall würde ich trotzdem von statischen Bildern absehen. Übrigens werden Ressourcen intern zwischengespeichert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X