Vì một hàm tạo enum chỉ có thể được gọi bởi các hằng số của nó, tại sao nó được phép đóng gói riêng tư?Tại sao một enum có một nhà xây dựng gói-tư nhân?
Trả lời
Nhà xây dựng thực sự không phải là gói riêng tư ... nó hoàn toàn là private
cách thức giao diện theo cách hoàn toàn là public
ngay cả khi bạn không thêm từ khóa.
Các phần có liên quan của JLS (§8.8.3) khẳng định:
If no access modifier is specified for the constructor of a normal class, the constructor has default access.
If no access modifier is specified for the constructor of an enum type, the constructor is
private
.It is a compile-time error if the constructor of an enum type (§8.9) is declared
public
orprotected
.
trích dẫn: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.3 –
@Ryan Stewart: Cảm ơn vì đã tìm ra điều đó. – ColinD
Đó là một điều không minh bạch của ngôn ngữ: constructors enum là ngầm tư nhân.
Điều thú vị là nếu bạn khai báo một enum constructor package-visible, như thế này:
public enum MyEnum {
A(0),
B(1);
private final int i;
MyEnum(int i) {
this.i = i;
}
public int getI() {
return i;
}
}
bạn không thể đề cập đến nó từ một lớp khác trong gói. Nếu bạn cố gắng, bạn nhận được lỗi biên dịch:
Cannot instantiate the type MyEnum
Rõ ràng bạn có thể thử điều này với enum là lớp lồng nhau tĩnh hoặc trong một phương thức của enum. Có, trình biên dịch không thành công với lỗi đã nói. – Vlasec
"nếu bạn khai báo một hàm tạo enum có thể nhìn thấy gói" ... nhưng thực ra không có cách nào để làm điều đó. – raghavsood33
@ raghavsood33 có bạn có thể. Xem mã compilable tôi thêm vào câu trả lời của tôi mà chứng minh một nhà xây dựng có thể nhìn thấy gói. – Bohemian
- 1. Tại sao không có cuộc gọi đến nhà xây dựng?
- 2. Làm thế nào để ném một ngoại lệ từ một nhà xây dựng enum?
- 3. Tại sao di chuyển-nhà xây dựng không được gọi?
- 4. Một lớp học có cả nhà xây dựng công cộng và tư nhân không?
- 5. Nhà xây dựng bản sao Weird
- 6. Tôi có thể gọi một nhà xây dựng bản sao một cách rõ ràng không?
- 7. Tại sao phải xây dựng một khối lập phương SSAS?
- 8. một nhà xây dựng như một đại biểu - là nó có thể trong C#?
- 9. Tại sao các loại không có nhà xây dựng dữ liệu hợp lệ?
- 10. Nhà xây dựng BufferedReader mong đợi một FileReader
- 11. Mapping để một kiểu tùy chỉnh trong đó có một nhà xây dựng nội
- 12. Tại sao một người sẽ xây dựng người giám sát bên trong một công trình xây dựng?
- 13. C++: Phân bổ lại vector tự động gọi các nhà xây dựng sao chép? Tại sao?
- 14. Tại sao bản sao khởi tạo theo cách đó? Tại sao yêu cầu các nhà xây dựng bản sao?
- 15. Một mẫu thiết kế cho các nhà xây dựng
- 16. Thừa kế bản sao của nhà xây dựng
- 17. các nhà xây dựng bên trong một không gian tên
- 18. Trả lại sớm từ một nhà xây dựng Scala
- 19. Sử dụng nhiều chuỗi nhà xây dựng cho một chuỗi
- 20. Đam mê một nhà xây dựng bằng javascript với sinon
- 21. nhà xây dựng và Thừa kế
- 22. Tại sao dh_usrlocal ném lỗi xây dựng?
- 23. Có thể thoát ra một cách duyên dáng trong một nhà xây dựng không?
- 24. Có thể hoàn thành được gọi sau khi một nhà xây dựng ném một ngoại lệ?
- 25. Ủy nhiệm các nhà xây dựng: một bộ khởi tạo cho một nhà xây dựng ủy nhiệm phải xuất hiện một mình
- 26. Tại sao xây dựng cùng một dự án tạo ra tệp EXE khác nhau cho mỗi nhà phát triển
- 27. tại sao danh sách các nhà xây dựng thực tế của một lớp trong javascript quan trọng
- 28. Mặc định nhà xây dựng trong Java
- 29. Tại sao tôi phải nắm bắt lambda đến một biến trường trong cuộc gọi đến nhà xây dựng
- 30. trình biên dịch tạo nhà xây dựng
cho phép để tiết kiệm một chút trên không gian mã và để tránh rườm rà không cần thiết (như giao diện không cần 'abstract' công khai trước mọi phương pháp) –
@ratchetfreak: Đó là không giống như giao diện. Các phương thức giao diện là * luôn luôn * 'abstract công khai'. Làm cho các công cụ sửa đổi được cho phép rõ ràng, nhưng không có cách nào để thay đổi chúng. –
@RyanStewart cũng không có cách nào để gọi một hàm tạo enum, vì vậy nó trở nên riêng tư về logic và cho phép gói riêng tư cho phép lưu vài ký tự đó –