Tôi biết bạn đang nói gì.
Tôi ví dụ, muốn có một giao diện (mà tôi gọi ExecutableList) có một String lĩnh vực contant gọi USER_FRIENDLY_NAME
public interface ExecutableList<T extends ExecutableList<T,E>,E> //This is type parameter
extends List<E>, //self referencing. Trust
Comparable<E>, //me, it has its uses.
{
/** This would declare a constant but leave it to sub-interfaces/classes to define it. */
abstract String USER_FRIENDLY_NAME;
//Define the rest of your interface
}
Thật không may, điều này là không thể trong Java. Khi bạn khai báo một trường trong giao diện Java, nó ngụ ý các biến tố public
, static
và final
.Một thay đổi trong tương lai đối với ngôn ngữ lập trình Java MIGHT cho phép thêm abstract
, do đó làm cho các sửa đổi ngụ ý public abstract static final String USER_FRIENDLY_NAME;
nhưng trong khi bạn có thể xác định rõ ràng các quy tắc cho điều này, việc sử dụng từ abstract
sẽ gây nhầm lẫn, như abstract
và final
thường được hiểu là định nghĩa ý nghĩa ngược lại.
Tôi đang vượt qua các ngón tay của mình rằng phiên bản Java trong tương lai sẽ thực hiện việc này. Tôi đã nghe nói rằng các phương thức giao diện riêng sẽ được thêm vào trong Java 9 (để sử dụng giữa các phương thức mặc định) nhưng không có từ nào được bổ sung vào ngôn ngữ này. Có một số vấn đề tương thích ngược để xem xét trước, tôi chắc chắn. Nếu bất cứ ai từ Oracle đọc điều này, XIN VUI LÒNG CHO CHÚNG TÔI QUYẾT ĐỊNH VỀ CÁC GIAO TIẾP VÀ LET INHERITING CLASSES/INTERFACES DEFINE THEM !!!
Trong thời gian chờ đợi, tùy chọn duy nhất của bạn là xác định phương thức String getUserFriendlyName();
trong giao diện hoặc lớp trừu tượng của bạn. Không thanh lịch và có lẽ không hiệu quả, nhưng hiện tại bạn không có lựa chọn nào khác.
Có thể đáng lưu ý rằng hằng số có giá trị tiềm năng khác nhau không phải là hằng số! Vì vậy, đi với Peters câu trả lời. – TedTrippin