2013-06-27 35 views
8

Nếu tôi khai báo một biến trước hoặc không khai báo hằng enum theo cách này:Tại sao các hằng số enum phải được khai báo trước bất kỳ biến nào khác và khai báo phương thức trong một kiểu enum?

enum MyEnum 
{ 
    int i = 90; 
} 

Nó cho thấy sau lỗi biên dịch.

MyEnum.java:3: <identifier> expected 
{ 
^ 
MyEnum.java:4: ',', '}', or ';' expected 
     int i = 90; 
     ^
MyEnum.java:4: '}' expected 
     int i = 90; 
      ^
MyEnum.java:5: class, interface, or enum expected 
} 
^ 
4 errors 

Nhưng nếu tôi khai báo hằng số enum trước khi khai báo i thì nó sẽ biên dịch tốt.
Ngay cả những đoạn mã sau sẽ biên dịch tốt:

enum MyEnum 
{ 
    ;//put a semicolon 
    int i = 90; 
} 

Tại sao java enum được thiết kế theo cách này?

+0

Đầu tiên và quan trọng nhất, 'enum' được thiết kế để trở thành * liệt kê * nhiều hơn 0 phần tử. Thiết kế này hoàn toàn hợp lệ. –

+0

Vì bắt buộc phải có ít nhất một hằng số enum. Vì đó là cách cú pháp được định nghĩa trong Đặc tả Ngôn ngữ Java. Bởi vì. – EJP

+0

@EJP Nhưng trong trường hợp sau này tôi đã không tuyên bố bất kỳ hằng số enum nhưng chỉ đơn giản là nối thêm một dấu chấm phẩy trước khi tuyên bố một biến. Không phải là nó đi ngược lại nhiệm vụ mà một 'Enum' nên có ít nhất một hằng số enum? –

Trả lời

10

; cho biết kết thúc danh sách số nhận dạng enum. Rõ ràng bạn có thể có một danh sách enum rỗng, nhưng bạn phải có một.

Xem 8.9.1 của Java Language Specification:

8.9.1 Enum Constants
Cơ thể của một kiểu enum enum có thể chứa hằng

+4

Cụ thể: 'EnumBodyDeclarations: ; ClassBodyDeclarationsopt' – assylias

+0

Thnx cho phản hồi nhanh và liên kết có liên quan đến JLS. Vâng, tôi đã đi qua liên kết đó. Nhưng tôi không thể có được một lý do cho hạn chế desgin như vậy cho enums trong java. Vì vậy, cuối cùng nó phải được giả định rằng nó chỉ là cách java đã chọn lựa để thiết kế enums? Không có lý do nào khác như: cách thức enums được JVM xử lý về tải, khởi tạo hay bất kỳ thứ gì khác ... –

2

Hai phần bắt buộc của enum là:

  1. số nhận dạng enum;
  2. cơ thể enum.

Bạn phải lần đầu tiên tuyên bố định enum danh sách trước khi enum cơ thể. Ở đây, ; đang hiển thị phần đầu tiên, vì phần đầu tiên là bắt buộc. Nếu bạn bỏ qua điều đó, nó sẽ tạo ra một lỗi biên dịch. Nếu bạn thêm ; thì nó sẽ biên dịch khi bạn đáp ứng cả hai tiêu chí.

Các vấn đề liên quan