In un metodo ho questo:Perché una variabile locale in Java non è considerata "efficacemente definitiva" anche se nulla lo modifica in seguito?
int x = 0
if (isA()) {
x = 1;
} else if (isB()) {
x = 2;
}
if (x != 0) {
doLater(() -> showErrorMessage(x)); // compile error here
}
// no more reference to 'x' here
non capisco il motivo per cui produce errore di compilazione. L'errore dice che x
non è definitivo o effettivamente definitivo, quindi non è possibile accedervi dal corpo lambda. Non è stata apportata alcuna modifica a x
dopo la chiamata doLater
, pertanto il valore di x
è già determinato quando viene chiamato doLater
.
Sto indovinando che la risposta a questa domanda è perché x
non è qualificato per essere chiamato una variabile efficacemente finale. Tuttavia, voglio sapere qual è la ragione.
Non può il compilatore solo creare una variabile temporanea finale, di fatto rendendo il codice come:
if (x != 0) {
final int final_x = x;
doLater(() -> showErrorMessage(final_x));
}
e tutto continua a funzionare lo stesso?
Perché pensi che il compilatore sarà in grado di farlo? – Tunaki
Il compilatore può tenere traccia dell'ultimo posto in cui una variabile viene modificata, tranne che non è ciò che fa. –
@Tunaki perché sa che x non viene modificato dopo il lambda, quindi può sempre garantire che x sia già stato risolto dal momento in cui viene utilizzato. – yuku