Das weiß jeder fortgeschrittene Java Entwickler, aber ich mag die Frage trotzdem um eine kleine aber interessante Wissenslücke zu stopfen, weil das gerne mal übersehen oder vergessen wird im immer wiederkehrenden Kontext der Standard for-Schleife…
Kompliziert das jetzt am Handy zu lösen aber man kann eine typische for-Schleife
for(int i = 0; i < n; i++)
genauso gut so schreiben
for(int i = 0; i++ < n; )
Danke für die info. Dass es der Zweitaccount eines bekannten Users ist hatte ich mir schon fast gedacht Inzwischen hat er mir auf indirektem weg einen Tipp gegeben.
Ich hatte tatsächlich zuerst an ein Schachbrett gedacht. Fand das wegen der fehlenden Zeilenumbrüche zu schräg gedacht.
Nach diesem Tipp ist das Rätsel nicht mehr so interessant. Ich hatte gehofft, da steckt eine spannende Idee dahinter. Insofern braucht niemand mehr eine Brieftaube losschicken
a=null // da der Konstruktor von DangerousSelfReference erst nachdem alle member variablen initialisiert worden sind ausgeführt wird.
b=“b”
c=“c” //hier rate ich nur dass der compiler dies schon auflöst, da es final ist.
d=null //ist noch null da der Konstruktor von SomeClass zuerst ausgeführt wird, da die members einfach von oben nach unten durcggegangen werden.
ref=null //Konstruktor wird vor der Zuweisung ausgeführt.
AFAIK hat sich das Verhalten zwischen der Oracle 8 und Oracle 9 JVM in diesem Fall geändert.
Ich meine zumindest das ein ähnlicher Fall erst mit J9 zu einem Absturz geführt hatte, weil die Reihenfolge der Initialisierung sich änderte.
b initialisiert ist und d nicht (weil er “von oben nach unten” durchgeht)
c initialisiert ist und d nicht (weil c dort final ist)
sind Sachen, bei denen man zumindest kurz zögern und (dann vielleicht richtig raten, aber) nur schwer “mit Sicherheit” die richtige Antwort geben könnte.
hast du im Bytecode einmal kontrolliert,ob der compiler c überhaupt anlegt und nicht einfach in der getc Methode inlined? Macht der compiler überhaupt solche Optimierungen?
Kontrolliert nicht, aber da man sich mit Reflection die Fields abholen kann (und mit JNI auch final fields ändern kann) ist er da im Handlungsspielraum etwas eingeschränkt…