[JAVA] Was sind praktisch endgültige Variablen?

Praktisch endgültig

Es scheint, dass Java-Lambda-Ausdrücke auf lokale Variablen zugreifen können, die ** praktisch endgültig ** sind. Das Nachschlagewerk sagte: "Variablen, die sich nicht ändern, auch wenn sie nicht mit ** final ** qualifiziert sind."

Was meinst du

"Es kommt nicht mit ** final **, aber es hat sich seit seiner Erklärung überhaupt nicht geändert, also ist es dasselbe wie ** final **!"

In diesem Fall ist die lokale Variable "i" praktisch endgültig.

LambdaStudy.java


public class LambdaStudy {

	public static void main(String[] args) {
		int i = 10;
		Calculate c = x -> x + i;
		System.out.println(c.calc(20));//30
	}
}

interface Calculate {
	public int calc(int x);
}

In diesem Fall ist der Wert von "i", da er durch Inkrementieren geändert wurde, praktisch nicht endgültig und es tritt ein Kompilierungsfehler auf.

LambdaStudy.java


public class LambdaStudy {

	public static void main(String[] args) {
		int i = 10;
		i++;
		Calculate c = x -> x + i;//Local variable i defined in an enclosing scope must be final or effectively final
		System.out.println(c.calc(20));
	}
}

interface Calculate {
	public int calc(int x);
}

Wie wäre es mit einem Referenztyp

Es ändert sich auch dann nicht, wenn es sich um einen Referenztyp handelt.

In diesem Fall liegt "sb" daran, dass "sb.append (" d ")" nur das referenzierte Objekt der Variablen "sb" ändert, nicht die Variable "sb" selbst. Es wird praktisch endgültig und kann ausgeführt werden.

LambdaStudy.java


public class LambdaStudy {

	public static void main(String[] args) {
		int i = 10;
		StringBuilder sb = new StringBuilder("abc");
		sb.append("d");
		Calculate c = x -> {
			System.out.println(sb.toString());//abcd
			return 	x + i;
		};
		System.out.println(c.calc(20));//30
	}
}

interface Calculate {
	public int calc(int x);
}

Wenn Sie sb neu zuweisen, ändert sich das Referenzziel von sb, sodass es praktisch nicht endgültig ist. (Kompilierungsfehler)

LambdaStudy.java


public class LambdaStudy {

	public static void main(String[] args) {
		int i = 10;
		StringBuilder sb = new StringBuilder("abc");
		sb.append("d");
		sb = new StringBuilder("efg");
		Calculate c = x -> {
			System.out.println(sb.toString());//Local variable sb defined in an enclosing scope must be final or effectively final
			return 	x + i;
		};
		System.out.println(c.calc(20));
	}
}

interface Calculate {
	public int calc(int x);
}

Zusammenfassung

Im Wesentlichen endgültige Variablen sind ** "Variablen, die sich seit der Deklaration der Variablen überhaupt nicht geändert haben" **.

Recommended Posts

Was sind praktisch endgültige Variablen?
[Umgebungsvariablen] Schienen Was sind Umgebungsvariablen?
Was ich in Java gelernt habe (Teil 2) Was sind Variablen?
[Java Silver] Was sind Klassenvariablen, Instanzvariablen und lokale Variablen?
[Schienen] Was sind starke Parameter?
Was ist ein Befehlszeilenargument?
Was sind Ruby-Klassenmethoden?
config.ru Was machst du?
Was sind Sicherheitslücken bei Massenzuweisungen?
Was sind Java-Metriken? _Memo_20200818
[Java] Verwendung statischer Modifikatoren (Was sind statische endgültige und statische Importe)
Java-Array-Variablen sind Referenztypen
Was sind die Regeln in JUnit?
Lokale Java-Variablen sind threadsicher
[Java] Was sind Überschreibungen und Überladungen?