Trong một phương pháp tôi có điều này:Tại sao một biến cục bộ trong Java không được coi là "hiệu quả cuối cùng" mặc dù không có gì thay đổi nó sau đó?
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
Tôi không hiểu tại sao nó tạo ra lỗi biên dịch. Lỗi nói rằng x
không phải là cuối cùng hoặc hiệu quả cuối cùng, do đó, nó không thể được truy cập từ cơ thể lambda. Không có sửa đổi đối với x
sau cuộc gọi doLater
, vì vậy giá trị của x
thực sự đã được xác định khi được gọi là doLater
.
Tôi đoán câu trả lời cho câu hỏi này là vì x
không đủ điều kiện để được gọi là biến cuối cùng hiệu quả. Tuy nhiên, tôi muốn biết lý do là gì.
thể không trình biên dịch chỉ cần tạo một biến thức tạm thời, làm cho có hiệu quả chương trình như:
if (x != 0) {
final int final_x = x;
doLater(() -> showErrorMessage(final_x));
}
và mọi thứ vẫn hoạt động giống nhau không?
Tại sao bạn nghĩ rằng trình biên dịch sẽ có thể làm điều đó? – Tunaki
Trình biên dịch có thể theo dõi vị trí cuối cùng một biến được thay đổi, ngoại trừ đó không phải là những gì nó làm. –
@Tunaki bởi vì nó biết rằng x không được sửa đổi sau lambda, vì vậy nó luôn luôn có thể đảm bảo rằng x đã được cố định bởi thời gian nó được sử dụng. – yuku