[JAVA] Quelles sont les variables pratiquement finales?

Pratiquement définitif

Il semble que les expressions lambda Java puissent accéder à des variables locales qui sont ** pratiquement finales **. Le livre de référence disait: "Des variables qui ne changent pas même si elles ne sont pas qualifiées avec ** final **."

Que voulez-vous dire

"Il ne vient pas avec ** final **, mais il n'a pas du tout changé depuis qu'il a été déclaré, donc c'est la même chose que ** final **!"

Dans ce cas, la variable locale «i» est pratiquement définitive,

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);
}

Dans ce cas, puisque la valeur de «i» a été modifiée par incrémentation, elle n'est pratiquement pas définitive et une erreur de compilation se produit.

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);
}

Que diriez-vous d'un type de référence

Il ne change pas même s'il s'agit d'un type de référence.

Dans ce cas, «sb» est dû au fait que «sb.append (« d »)» ne change que l'objet référencé de la variable «sb», pas la variable «sb» elle-même. Il devient pratiquement définitif et peut être exécuté.

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);
}

Si vous réaffectez à sb, la destination de référence de sb changera, donc elle ne sera pas pratiquement définitive. (Erreur de compilation)

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);
}

Résumé

Les variables essentiellement finales sont ** "des variables qui n'ont pas du tout changé depuis que la variable a été déclarée" **.

Recommended Posts

Quelles sont les variables pratiquement finales?
[Variables environnementales] rails Quelles sont les variables environnementales?
Ce que j'ai appris en Java (partie 2) Que sont les variables?
[Java Silver] Que sont les variables de classe, les variables d'instance et les variables locales?
[rails] Que sont les paramètres forts?
Qu'est-ce qu'un argument de ligne de commande?
Que sont les méthodes de classe Ruby?
config.ru Que faites-vous?
Que sont les vulnérabilités d'attribution de masse?
Que sont les métriques Java? _Memo_20200818
[Java] Comment utiliser les modificateurs statiques (Que sont l'importation statique finale et statique)
Les variables de tableau Java sont des types de référence
Quelles sont les règles de JUnit?
Les variables locales Java sont thread-safe
[Java] Que sont les remplacements et les surcharges?