Datentypen Globale Variable direkt initialisieren oder im Konstruktor?

kirdie

Bekanntes Mitglied
Ich habe eine Klasse mit genau einem Konstruktor und unter anderem einem Cache als globale Variable.
Kann es irgendwelche Probleme geben, wenn ich die globale Variable direkt initialisiere oder ist das egal?

Variante 1:
Java:
public class FrequencyHelper
{
	Map<String,Integer> cache = new HashMap<String,Integer>();
	
	public FrequencyHelper()
	{
		....
	}	
}

Variante 2:
Java:
public class FrequencyHelper
{
	Map<String,Integer> cache;
	
	public FrequencyHelper()
	{
		cache = new HashMap<String,Integer>();		
		....
	}	
}
 
G

Gastredner

Gast
Ich nutze die erste Methode, seit ich einmal lange nach der Ursache einer NullPointerException suchen musste - ich hatte zuvor in einer Klasse letztere Methode verwendet und später einen weiteren Konstruktor hinzufügen müssen, wobei ich aber die Initialisierung meines Objektes vergaß (es war einfach der Standardkonstruktor, wurde vom Framework verlangt).
Initialisiere ich die Variable gleich bei der Deklaration, muss ich mich im Konstruktor nicht mehr darum kümmern - aus meiner Sicht einfacher, wenn man den Code dann u. U. umändern bzw. ergänzen muss.
 

U2nt

Bekanntes Mitglied
Bei mir kommt es ganz auf den Variablentyp an, wenn ich z.B. einen Konstruktor für ein JFrame schreibe, tue ich erst

Java:
private JLabel label = null;

aufrufen und dann im Konstruktor mit Werte füllen. Andere Dinge, z.B. Stringarrays (z.B. für JOptionPane Antwortmöglichkeiten), dann wie die erste Methode es sagt.

@Gastredner: Bei mir ist da nochnie ne Nullpointerexception aufgerufen worden?
 
S

SlaterB

Gast
> @Gastredner: Bei mir ist da nochnie ne Nullpointerexception aufgerufen worden?

was willst du denn damit sagen, was ist 'da'?
Gastredner hat eine klare Situation beschrieben, die 100% zu einer NPE führt (wenn man sie denn auch entsprechend hat..)


---------

= null;
empfehle ich persönlich nicht zu schreiben, einfach weglassen geht genauso und kann folgenden Effekt herbeiführen
(wenn auch in an sich fraglichen unsauberen Aufbau)
Java:
public class Test  {
    public static void main(String[] args) {
        new A();
    }
}

class A  extends B {
    private String x;
    private String y = null;

    public A()  {
        System.out.println("x: " + x);
        System.out.println("y: " + y);
    }

    public void init()  {
        x = "xxxxxxxxxx";
        y = "yyyyyyyyyy";
    }
}

abstract class B {
    public B() {
        init();
    }

    public abstract void init();
}
Ausgabe:
x: xxxxxxxxxx
y: null
 

Painii

Bekanntes Mitglied
Mich würde auch der Unterschied interessieren zwischen beiden Methoden, wann wird das erste denn ausgeführt (Beim Laden der Klasse geht nicht, weil für jedes Objekt ne neue Map gebaut werden muss, also vor jedem Konstruktoraufruf?)

Ich würde die 2. Methode nutzen, muss dabei dann eben wirklich drauf achten das in jedem Konstruktor zu initialisieren (sonst fliegen wie oben erwähnt irgendwo mal die NPE ohne dass man den Fehler sofort sieht)
 

kirdie

Bekanntes Mitglied
Erstmal danke an alle.
Den Code von SlaterB verstehe ich allerdings nicht:

Java:
class A  extends B {
    private String x;
    private String y = null;

    public A()  {
        System.out.println("x: " + x);
        System.out.println("y: " + y);
    }

    public void init()  {
        x = "xxxxxxxxxx";
        y = "yyyyyyyyyy";
    }
}

Würde dieser Code überhaupt kompilieren? x ist ja nicht initialisiert, denn init wird ja nicht garnicht aufgerufen.
Fehlt da vielleicht ein super(); im Konstruktor von A? Aber selbst wenn, können abstrakte klassen überhaupt Konstruktoren haben/aufrufen?

Java:
abstract class B {
    public B() {
        init();
    }

    public abstract void init();
}

Auch das kommt mir irgendwie komisch vor, die Init ist ja abstrakt, wie soll man die da aufrufen können?

Ich probier das mal bei mir aus...

Edit: Also es funktioniert ja tatsächlich. Komisch, bei mir meckert das Java sonst immer rum wenn ich variablen aufrufe die nicht initialisiert wurden und will dann garnicht kompilieren. Und auch der Rest: Erstaunlich dass das geht, verstehe ich aber nicht ganz :)
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
Normal sollte man doch eh alles in einem(und zwar den am meisten Paramaterisiertesten ) initialisieren, dann hat man diese Probleme (Map nicht initialisiert) doch garnicht, wenn alle Anderen diesen schön aufrufen :D ?!
 
S

SlaterB

Gast
@kirdie
ist ein kompliziertes Beispiel mit mehreren Klassen, die per Vererbung durcheinander arbeiten,
muss du nicht verstehen,
jedenfalls gibts bei Klassenattributen kein 'nicht initialisiert', die sind immer null, 0 oder false wenn nicht anders angegeben,
das = null; kann man weglassen, bringt nichts, nur Probleme im Extremfall (wird erst nach Abschluss der Super-Konstruktoren ausgeführt)
 
Zuletzt bearbeitet von einem Moderator:

Meru

Bekanntes Mitglied
Ich glaube Eclipse macht da Unterschiede bzgl Compilieren.
Eclipse gibt dir das als Warunung bzw. als Error aus weil es eben zu einen Fehler führen >kann<, nicht muss. Das Warning etc kann man in Eclipse einstellen.

Ich persöhnlich würde eine init() Methode bevorzugen, eben aus dem Grund, dass man neue Konstruktoren hinzufügt und sowas mal vergessen kann (mir auch schon passiert)
 
G

Gast2

Gast
Ich habe eine Klasse mit genau einem Konstruktor und unter anderem einem Cache als globale Variable.
Kann es irgendwelche Probleme geben, wenn ich die globale Variable direkt initialisiere oder ist das egal?

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 6.6 Klassen- und Objektinitialisierung

ansonsten kann ich aus Erfahrung sprechen das der erste Konstrukt unter Eclipse läuft ... aber auf dem Root-Server kam nach X Monaten eine NullPointerException ;( ... und nun such mal den Fehler wieder mit Eclipse wo die Initialsierung funktioniert :autsch:

hand, mogel
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Globale Variable mehrmals verwenden Java Basics - Anfänger-Themen 7
Traxter Globale Variable ? Java Basics - Anfänger-Themen 11
Jackii Globale Variable aus anderer Klasse ändern... Java Basics - Anfänger-Themen 4
M Variablen Globale Variable? Java Basics - Anfänger-Themen 4
C lokale Variable verwenden statt globale Java Basics - Anfänger-Themen 7
S globale Variable deklarieren Java Basics - Anfänger-Themen 10
E Globale int Variable? Java Basics - Anfänger-Themen 6
T Globale Variable wird nicht gefunden Java Basics - Anfänger-Themen 6
T Globale Variable (Font) Java Basics - Anfänger-Themen 21
A Globale Variable änderbar Java Basics - Anfänger-Themen 3
M Superglobale globale Variable? Java Basics - Anfänger-Themen 10
P Globale Variable Java Basics - Anfänger-Themen 3
J "globale" variable definieren? Java Basics - Anfänger-Themen 7
S Globale Variable / Methode Java Basics - Anfänger-Themen 5
P Globale Objekte Java Basics - Anfänger-Themen 2
S Vererbung/Globale Variablen Java Basics - Anfänger-Themen 8
Luk10 Globale (semi-finale) Varibalen Java Basics - Anfänger-Themen 9
U Globale Proxy Einstellungen ändern Java Basics - Anfänger-Themen 3
B Globale vector? Java Basics - Anfänger-Themen 7
B Methoden Globale Methoden "Toolbox" Java Basics - Anfänger-Themen 3
D globale Variablen zur Laufzeit erzeugen Java Basics - Anfänger-Themen 5
G Globale Variablen Java Basics - Anfänger-Themen 9
G Globale Variablen Java Basics - Anfänger-Themen 3
O globale variablen Java Basics - Anfänger-Themen 21
M Globale Variablen werden durch KeyListener nicht aktualisier Java Basics - Anfänger-Themen 10
G Müssen globale Funktionen immer "static" sein? Java Basics - Anfänger-Themen 13
A Globale Methode ohne imports und übergeben? Java Basics - Anfänger-Themen 2
P textfarbe,textgröße, textart als globale einstellung Java Basics - Anfänger-Themen 7
F Globale Variablen wie in C++? Java Basics - Anfänger-Themen 5
J "Globale Variablen" Java Basics - Anfänger-Themen 26
S globale Variablen Java Basics - Anfänger-Themen 9
D Globale Klassenvariablen. Java Basics - Anfänger-Themen 12
P Globale und ständige Überwachung eines Textfeldes auf text? Java Basics - Anfänger-Themen 40
J Globale Variablen Java Basics - Anfänger-Themen 3
D Globale Variablen Java Basics - Anfänger-Themen 31
C Globale Variablen und Array mit verschiedenen Typen Java Basics - Anfänger-Themen 3
S globale Variablen Java Basics - Anfänger-Themen 7
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
E Variable von 1. Fenster an 2. Fenster übergeben. Java Basics - Anfänger-Themen 7
T Variable in Schleife deklarieren, Speicherplatz, Garbage Collector Java Basics - Anfänger-Themen 10
T Datum als Variable wert Java Basics - Anfänger-Themen 4
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
M variable in anderer funktion aufrufen Java Basics - Anfänger-Themen 10
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
U Wie mache ich die Variable xyz eindeutig/unique? Java Basics - Anfänger-Themen 20
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
M Variable Felderanzahl Java Java Basics - Anfänger-Themen 10
T Variable durch Action Listener ändern Java Basics - Anfänger-Themen 2
stormyark Fehler beim überschreiben einer Variable Java Basics - Anfänger-Themen 1
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
M Variable in einer Schleife initialisieren Java Basics - Anfänger-Themen 46
W Schleife und einmal variable++ zu viel Java Basics - Anfänger-Themen 20
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
M Methoden Wert einer Variable geht verloren? Java Basics - Anfänger-Themen 6
G variable kopieren bzw. woanders benutzen Java Basics - Anfänger-Themen 6
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
J Double Variable und Addition Java Basics - Anfänger-Themen 2
I Variable innerhalb Methode: Local variable test defined in an enclosing scope must be final or effectively final Java Basics - Anfänger-Themen 3
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
Vivien Auf eine Variable von einer anderen Klasse aus zugreifen Java Basics - Anfänger-Themen 3
H Datentypen Wertebereich von <Klassenname> <Variable> Java Basics - Anfänger-Themen 12
M Private Variable Java Basics - Anfänger-Themen 2
idontknow707 Matrix nach z.B. Variable durchsuchen Java Basics - Anfänger-Themen 4
T Variable in for Schleife ansprechen ohne Array ? Java Basics - Anfänger-Themen 25
s.marcii Modulo in der Variable einsetzen - ist das möglich? Java Basics - Anfänger-Themen 2
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
Y Wie kann ich die Variable in der Try Catch returnen? Java Basics - Anfänger-Themen 3
K Übergabe des Wertes einer Variable aus main() in eine Klassenmethode Java Basics - Anfänger-Themen 8
B Inkrement von Variable Java Basics - Anfänger-Themen 8
V Variablen statische Variable einer Objektvariable zuordnen Java Basics - Anfänger-Themen 3
L Variable von einer Methode zu einer anderen Methode inkl. einer "Zwischenmethode" Java Basics - Anfänger-Themen 1
J JTextField Bezeichnung als Variable Java Basics - Anfänger-Themen 3
N Wie kann ich eine meine Variable Final machen? Java Basics - Anfänger-Themen 1
NeoLexx Variable für Array wird nicht korrekt übergeben Java Basics - Anfänger-Themen 45
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
H Variable um 1 erhört ausgeben Java Basics - Anfänger-Themen 4
V Erste Schritte Eine Array-Variable mit Benutzereingaben befüllen Java Basics - Anfänger-Themen 3
J Fehlermeldung unklar. non-static variable player0 cannot be referenced from a static context Java Basics - Anfänger-Themen 4
P non-static variable cannot be referenced from a static context Java Basics - Anfänger-Themen 6
A Wie zwei zahlen in einer Variable speichern? Java Basics - Anfänger-Themen 7
W Problem mit dem Wert von boolean-Variable Java Basics - Anfänger-Themen 3
M Input/Output JTextField Eingabe in String Variable speichern Java Basics - Anfänger-Themen 15
A Kann man eine Methode als Variable speichern und danach noch verändern? Java Basics - Anfänger-Themen 6
L cannot find symbol variable Kon Java Basics - Anfänger-Themen 8
C Statischer Typ aber Variable nicht statisch? Java Basics - Anfänger-Themen 5
H Variable.methode aufstellen, verstehen Java Basics - Anfänger-Themen 2
R Warnung, wenn eine Variable eingegeben wird Java Basics - Anfänger-Themen 6
S Variable einscannen Java Basics - Anfänger-Themen 30
N Best Practice Rückgabe eines Terminal Befehls in eine Variable speichern Java Basics - Anfänger-Themen 27
M Erste Schritte Mit Variable verschiedene Texte in Textfeld einfügen Java Basics - Anfänger-Themen 27
J Input-Variable nicht sichtbar Java Basics - Anfänger-Themen 2
L Warum ist Variable null? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben