# Feld initialisieren, direkt oder Konstruktor



## MartinDr141 (16. Okt 2006)

Hallo allerseits,

einfache Situation: ich habe ein Feld in einer Klasse, bsp.


```
class MyClass extends Irgendwas
{
  private int i;
  ...
}
```

Macht es einen Unterschied, ob ich das Feld bei der Deklaration gleich initialisiere oder ob ich das Feld erst im Konstruktor initialisieren? (Mal ausgegangen davon, dass es nur einen Konstruktor gibt)

also 1.


```
private int i = 3;
```

oder 2. 


```
public MyClass()
{
  i = 3;
}
```

Wenn es technisch keinen Unterschied macht, was ist zu präferieren?

Danke schonmal.


----------



## Leroy42 (16. Okt 2006)

Im Prinzip macht es keinen Unterschied. Es sei denn, du schreibst etwas wie


```
class MyClass extends Irgendwas { 
  private int i; 
  private int iPlus1 = i + 1;
  ... 
}
```

Die Initialisierungsreihenfolge ist

1) Der Superkonstruktor
2) Die außerhalb des Kunstruktors gefundenen Deklarationen in ihrer syntaktischen Reihenfolge
3) Der Konstruktor.

(Genau genommen werden die Deklarationen von Punkt 2 in den Konstruktor
hinter den super()-Aufruf kopiert).


----------



## Anmeldeboykottierer (16. Okt 2006)

MartinDr141 hat gesagt.:
			
		

> Macht es einen Unterschied, ob ich das Feld bei der Deklaration gleich initialisiere oder ob ich das Feld erst im Konstruktor initialisieren? (Mal ausgegangen davon, dass es nur einen Konstruktor gibt)



Es gibt einen Fall (ok, eigentlich mehrere), bei denen es einen Unterschied gibt. 
Hast du mehr als einen Konstruktor, dann gibt es hier einen Unterschied zwischen den beiden Varianten. Es kann sein, dass du in Konstruktor 1 den Wert anders initialisieren möchtest als in Konstruktor 2. 
Vergisst du nun die Initialisierung in einem der Konstruktoren, dann würde natürlich die Standardinitialisierung zum Einsatz kommen. Da hast du dann das Problem, dass du eine initialisierte Variable hast und der Compiler dich nicht warnen kann. Würdest du diese nun lesen und mit der weiter arbeiten, du hättest ein Problem (wegen ggf. falsche Initialisierung).

Fällt nicht großartig ins Gewicht, da dieser Fall wohl eher selten eintritt, immerhin müsste man die Variable initialisieren (direkt bei Deklaration) und gleichzeitig auch in einem Konstruktor einen anderen Wert erwarten (unwahrscheinlich dass man sie dann schon initialisiert), aber es ist halt eine mögliche Fehlerquelle. 

Trotzdem finde ich ist der bessere Platz zur Initialisierung der Konstruktor, da du hier den gesamten Initialierungsvorgang an einer Stelle hast. 

Gruß Der Anmeldeboykottierer


----------

