Por que a referência de método pode usar variáveis não finais?
Fiquei um pouco confuso sobre classes internas e expressão lambda, e tentei pedir umaPergunta, questão sobre isso, mas surgiu outra dúvida, e é provável que seja melhor postar outra pergunta do que comentar a anterior.
Direto ao ponto: eu sei (obrigado Jon) que algo assim não será compilado
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(); }
devido à maneira como o Java gerencia os fechamentos, porqueone
não é[efetivamente] final e assim por diante.
Mas então, como é que isso é 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(); }
Não é//2
equivalente a//1
? Não estou, no segundo caso, enfrentando os riscos de "trabalhar com uma variável desatualizada"?
Quero dizer, no último caso, depoisone = new One();
É executadof
ainda tem uma cópia desatualizada deone
(ou seja, referencia o objeto antigo). Não é esse o tipo de ambiguidade que estamos tentando evitar?