Ihr Fall entspricht
String str;
str = (str = "hello");
Obwohl die Zuordnungen lustig suchen, gibt es nichts konzeptionell falsch.
Dennoch ist eine variable Initialisierung, die sich selbst referenziert, offensichtlich keine gute Idee. Der Compiler wird versuchen, ihn in Situationen zu markieren, in denen ein Programmierfehler wahrscheinlich ist; der Compiler schafft es manchmal nicht; und kann auch einige Male über Bord gehen.
Eine lokale Variable hat eine strengere Anforderung (als eine Feldvariable) - sie muss zuerst zugewiesen werden, bevor ihr Wert verwendet wird. Zum Beispiel wird dies nicht kompiliert, weil die lokale Variable gelesen wird, bevor sie zugewiesen wird.
String str; // local variable
str = str; // error, try to read `str` before it's assigned
Eine Feldvariable hat immer einen Standardanfangswert; doch der Compiler prüft offensichtlich programer Fehler
int x = x+1; // error. x is field variable.
Aber es ist nicht katastrophal, wenn eine solche Überprüfung fehlschlägt, da x
Wert 0
vor explizite Zuweisung hat
int x;
{ x=x+1; } // ok. x==0, then x==1 after assignment
Wenn jedoch x
final
ist, wird der Code oben schlägt fehl, weil der Compiler eine eindeutige Zuordnung von x
zuerst vor dem Lesen x
erfordert, die gleiche Voraussetzung für eine lokale Variable. Aber diese Prüfung kann umgangen werden, weil es unmöglich ist, sie zu analysieren und zu verhindern, vollständig für Feldvariablen
final int x = (this).x+1; // compiles!
In einigen Fällen geht der Compiler über Bord, verhindert legit Fälle Verwendung Lambda beteiligt
Runnable r1 =()->System.out.println(r1); // r1 is a field variable
Es gibt nichts, konzeptionell problematisch in diesem Anwendungsfall; es kann von (this).
auch umgangen werden.
(str = "Hallo") gibt die Zeichenfolge "Hallo" zurück. Eclipse rät von der Nachricht ab: "Die Zuweisung zur Variablen str hat keine Auswirkung" – LeTex
@LeTex Ich setze Eclipse generell strenger und melde dies als Fehler anstatt als Warnungen. Ich sehe keinen Grund für jemanden, Konstrukte wie diese zu verwenden, obwohl sie von der JLS erlaubt sind. – biziclop
Eine dieser interessanten Fragen, bei denen man denkt, "wer schreibt Code wie diesen und warum". Rein akademisch, sicher? – TEK