Initialization Block?

G

Gast2

Gast
Keine Ahnung wie ich es nennen soll - aber mir ist heute doch tatsächlich mal was neues über den Weg gelaufen was ich so bisher noch nicht gesehn hab, und auch nicht wusste was das sein soll:

Java:
public class Test{
	
	public Test(){
		System.out.println("Called constructor");
	}

	{      // WTF? Was ist das hier?
		System.out.println("Called init block");
	}
	
	static {
		System.out.println("Called static block");
	}

	public static void main(String[] args) {
		Test t = new Test();
		t= new Test();
	}
}

static Blöcke waren mir ja bekannt auch wenn ich sie recht wenig benutze, aber dieser Block nicht wirklich... der wird anscheinend aufgerufen bei der Instantierung vor dem Constructor Aufruf. Sehr strange.

Das beste daran - man kann sogar schon Membervariablen modifizieren:
Java:
public class Test{
	
	int a;
	static int b; 
	
	public Test(){
		System.out.println("Called constructor");
		System.out.println(a);
		System.out.println(b);
	}

	{
		a = 1;
		b = 2;
		System.out.println("Called init block");
	}
	
	static {
		System.out.println("Called static block");
		b = 1;
	}

	public static void main(String[] args) {
		Test t = new Test();
		t= new Test();
	}
}

Und sehr sehr abgefahren ist - ich kann soviele Blöcke definieren wie ich will und die werden der Reihenfolge nach abgearbeitet:
Java:
public class Test{
	
	{
		System.out.println("Called init block4");
	}
	
	public Test(){
		System.out.println("Called constructor");
	}

	{
		System.out.println("Called init block");
	}
	
	{
		System.out.println("Called init block1");
	}
	
	{
		System.out.println("Called init block2");
	}
	
	static {
		System.out.println("Called static block");
	}

	{
		System.out.println("Called init block3");
	}
	
	public static void main(String[] args) {
		Test t = new Test();
		t= new Test();
	}
}

So - genug Beispiele. Wer kennt diese Konstruktion? Wozu soll die gut sein?

Ich fand sie nur verwirrend und ist mir in ca 5 Jahren Java bisher noch nicht untergekommen. Wuuste nicht mal das es sie gibt - und erst recht nicht sowas wie in meinem letzten Beispiel. Weiß auch nicht genau wonach ich da bei der allwissenden Müllhalde suchen soll?
 
G

Gast2

Gast
Ich glaube das ganze nennt sich double brace initialization (müsste auch irgendwo nen Thread zu sein im Forum).
Oder einfach mal nach googlen, da findest du genug infos.
 
G

Gast2

Gast
double brache init kannte ich, allerdings in etwas anderer Form:

Java:
private Map map = new HashMap(){{
put(obj1, 3);
put(obj2, 4);
}}

Genau überlegt tut es ja das gleiche - ABER was ich besonders häßlich dran finde - das die Blöcke über den ganzen Source verteilt werden können und der Reihenfolge nach abgearbeitet werden. Und ich hatte nicht erwartet das die [c]put(obj1,x)[/c] vor dem Konstruktoraufruf ausgeführt werden.
 
Zuletzt bearbeitet von einem Moderator:

Wortraum

Bekanntes Mitglied
So - genug Beispiele. Wer kennt diese Konstruktion? Wozu soll die gut sein?
Um beispielsweise endgültigen Variablen einen Wert zuzuweisen, Listen mit Objekten zu füllen oder Dinge einmalig ausführen, wenn das erste Objekt von der Klasse erstellt wird.

Zum Beispiel:
Java:
private static final List<Integer> THRESHOLDS;
static {
  List<Integer> thresholds = new ArrayList<Integer> ();
  thresholds.add(500);
  thresholds.add(730);
  thresholds.add(850);
  THRESHOLDS = Collections.unmodifiableList(thresholds);
}

Oder so etwas:
Java:
private static ConnectionHandler cc = null;

static {
    Thread hook = new Thread() {
        @Override
        public void run() {
            if (cc != null) {
                cc.disconnect();
            }
        }
    };
    Runtime.getRuntime().addShutdownHook(hook);
}

Genau überlegt tut es ja das gleiche
Und noch einmal genau darüber nachgedacht, kommt man zu dem Ergebnis, daß es das nicht tut. ;)
 
G

Gast2

Gast
Um beispielsweise endgültigen Variablen einen Wert zuzuweisen, Listen mit Objekten zu füllen oder Dinge einmalig ausführen, wenn das erste Objekt von der Klasse erstellt wird.

Ich meinte nicht einen static Block. Die kenne ich - auch wenn ich sie selten verwende. Aber ich hab jetzt eine befriedigende Antwort in dem Java Insel link gefunden.
 

Wortraum

Bekanntes Mitglied
Inzwischen habe auch ich kapiert, daß es Dir um den Objektinitialisierer ging. :oops: Die kannte ich zwar, verwendete sie aber bisher nie, und tatsächlich haben sie nicht allzu viel Sinn. Aber die Frage ist ja nun auch beantwortet.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Pre-Initialization Allgemeine Java-Themen 3
X Input/Output InputStream/Scanner(System.in) read()/hasNextLine() block unterbrechen Allgemeine Java-Themen 7
Neumi5694 Lambda - Block vs "Anweisungsliste" Allgemeine Java-Themen 8
I Java Optionals mit return-Block Allgemeine Java-Themen 2
C try-catch Block Verständnisfrage Allgemeine Java-Themen 14
B Sudoku-Block-Prüfung Allgemeine Java-Themen 1
P Threads Objekt im Konstruktor anders wie im Run()-Block Allgemeine Java-Themen 10
C Unendlich Wiederholungsfehler bei try catch - Block Allgemeine Java-Themen 3
T Warum ein privileg block? Allgemeine Java-Themen 0
H Probleme mit finally-Block und close() Allgemeine Java-Themen 4
N String aus Try/Catch-Block übernehen Allgemeine Java-Themen 14
B Execption auf Oberfläche werfen, try-catch-Block Allgemeine Java-Themen 6
A Annotation einer Subklasse im static-Block auslesen. Allgemeine Java-Themen 6
E JNA:Zugriff auf Common-Block von Fortran bzw. Struct in C Allgemeine Java-Themen 2
J synchronized block mit this und wait() Allgemeine Java-Themen 5
D break block by label Allgemeine Java-Themen 14
M Konstruktor / statischer Block Allgemeine Java-Themen 13
G URLClassLoader stößt static Block nicht an Allgemeine Java-Themen 8
G GC Warning: Repeated allocation of very large block Allgemeine Java-Themen 35
E try/catch Block um ganzes Programm Allgemeine Java-Themen 10
conan2 static-Block in Klassen Allgemeine Java-Themen 6
H Ein synchronized Block ausreichend? Allgemeine Java-Themen 6
T rießiger try - catch - Block Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben