Đường cú pháp được cung cấp bởi cơ sở enum
của Java đôi khi có thể hơi khó hiểu. Hãy xem xét ví dụ này, mà không biên dịch:Ngữ cảnh tĩnh trong định nghĩa enum
public enum TestEnum {
FOO("foo") {
public void foo() {
helper(); // <- compiler error
}
};
String name;
TestEnum(String name) {
this.name = name;
}
public abstract void foo();
private void helper(){
// do stuff (using this.name, so must not be static)
}
}
bất cứ ai có thể giải thích lý do tại sao các trình biên dịch nói
Non-static method 'helper()' không thể được tham chiếu từ một bối cảnh tĩnh
Làm thế nào chính xác là bối cảnh này tĩnh?
Bạn có thể làm cho điều này biên dịch bằng cách thay đổi các cuộc gọi đến this.
helper()
(đây là một trong những điểm khó hiểu: nếu chúng ta thực sự đang ở trong một "bối cảnh tĩnh" như trình biên dịch cho thấy, làm thế nào có thể "this
" làm việc) hoặc bằng cách tăng mức hiển thị của helper()
lên mức mặc định. Bạn thích cái nào? Ngoài ra, vui lòng đề xuất tiêu đề câu hỏi hay hơn :-)
Chỉnh sửa: Tôi tìm thấy some discussion about this - nhưng không có câu trả lời thực. Đồng nghiệp của tôi nghĩ rằng thực tế rằng this.helper()
hoạt động thực sự là một lỗi trình biên dịch. Và thực sự với các phiên bản Java mới hơn có vẻ như không phải để hoạt động (mặc dù super.helper()
có): "không thể tìm thấy biểu tượng trợ giúp()". (Mặc dù có điều gì đó kỳ lạ xảy ra: sau khi thử với các phiên bản Java khác nhau, tôi không thể nhận được this.helper()
để biên dịch lại với bất kỳ ...)
Tôi có sách; bạn có nghĩa là câu đố nào? (Tôi không thể tìm thấy nó một cách nhanh chóng.) – Jonik
Cả hai bản sao của cuốn sách của tôi được đóng gói trong hộp ở đâu đó, vì vậy tôi không có ý tưởng. –