¿Por qué la referencia de método puede usar variables no finales?
Tenía cierta confusión sobre las clases internas y la expresión lambda, e intenté preguntarle a unpregunta sobre eso, pero luego surgió otra duda, y es probable que sea mejor publicar otra pregunta que comentar la anterior.
Directo al grano: lo sé (gracias Jon) que algo como esto no se compilará
public class Main {
public static void main(String[] args) {
One one = new One();
F f = new F(){ //1
public void foo(){one.bar();} //compilation error
};
one = new One();
}
}
class One { void bar() {} }
interface F { void foo(); }
debido a cómo Java maneja los cierres, porqueone
no es[efectivamente] final y así.
Pero entonces, ¿cómo es que esto está permitido?
public class Main {
public static void main(String[] args) {
One one = new One();
F f = one::bar; //2
one = new One();
}
}
class One { void bar() {} }
interface F { void foo(); }
No es//2
equivalente a//1
? ¿No estoy, en el segundo caso, enfrentando los riesgos de "trabajar con una variable desactualizada"?
Quiero decir, en este último caso, despuésone = new One();
es ejecutadof
todavía tengo una copia desactualizada deone
(es decir, hace referencia al objeto antiguo). ¿No es este el tipo de ambigüedad que estamos tratando de evitar?