2012-06-14 47 views
5

Tôi hiểu rằng tôi có thể tạo một enum như thế này:Có thể một enum java có nhiều hơn một hàm tạo không?

public enum MyEnum { 
    ONE(1), 
    TWO(2); 
    private int value; 
    private MyEnum(int value) { 
     this.value = value); 
    } 
    public int getValue() { 
     return value; 
    } 
} 

Nhưng tôi có một số câu hỏi:

1) Có vẻ như rằng các giá trị enum được công bố vào đầu. Có một định dạng cụ thể cho việc này không. Tôi có thể tuyên bố chúng ở bất cứ đâu không?

2) Có thể khai báo một enum với nhiều hơn một hàm tạo và đây có phải là điều mà đôi khi mọi người làm không?

+0

Bạn muốn chia sẻ cách bạn muốn sử dụng? –

+1

Tôi tự hỏi tại sao bạn không thử 2) trước? –

+0

Bạn thậm chí có thể [quá trình xây dựng quá tải] (http://stackoverflow.com/q/6870710/1064325). – falsarella

Trả lời

5
public enum MyEnum { 
    ONE(1), 
    TWO(1, 2); 
    private int value1, value2; 

    private MyEnum(int value) { 
     this.value1 = value; 
     this.value2 = 0; // default 
     // this.value2 = getFromSomewhereElse(); // get it at runtime 
    } 

    private MyEnum(int value1, int value2) { 
     this.value1 = value1; 
     this.value2 = value2; 
    } 

    public int getValue1() { 
     return this.value1; 
    } 

    public int getValue2() { 
     return this.value2; 
    } 
} 
  1. Vâng, bạn phải khai báo các giá trị enum lúc bắt đầu. Luôn luôn.
  2. Xem mã ở trên. Điều đó là có thể. Nếu mọi người làm điều đó phụ thuộc vào ứng dụng. Nếu bạn có rất nhiều trường và hầu hết trong số chúng phải là một giá trị mặc định, đó là một điều tốt để sử dụng nhiều hàm tạo. Ngoài ra, các giá trị cho các trường có thể được đọc khi chạy (từ một tệp hoặc một lớp tĩnh khác).
8
  1. Có, chúng phải được khai báo trước các trường khác trong lớp enum.
  2. Có, chúng có thể có nhiều hơn một hàm tạo.

Bạn có thể đã khám phá bằng cách tự mình thử.

+0

Tôi biết, nó có thể mất bao lâu? Tuy nhiên, nó bây giờ là ở đây cho khi những người khác tìm kiếm nó. Tôi quan tâm nhiều hơn đến những trường hợp nó sẽ hữu ích –

+0

Một enum là một lớp học. Nếu bạn đã hiểu lý do tại sao một số nhà xây dựng có thể hữu ích cho một lớp, bạn cũng đã hiểu tại sao họ có thể cho một enum: vì những lý do tương tự. –

+0

Enum là một loại đặc biệt của lớp. Chỉ hiển thị một ví dụ sẽ là một nhận xét hữu ích hơn nhiều so với ngụ ý rằng tôi không hiểu các nhà xây dựng quá tải. Từ bình luận của bạn tôi sẽ đoán ví dụ sẽ được mặc định một số lĩnh vực, đó là việc sử dụng phổ biến nhất cho quá tải constructors tôi biết ... –

3
  1. Theo số JLS 7, các hằng số sẽ được chuyển lên trước.

  2. "Bất kỳ hàm tạo hoặc khai báo thành viên nào trong khai báo enum áp dụng cho kiểu enum chính xác như thể chúng đã có mặt trong lớp của khai báo lớp bình thường, trừ khi được tuyên bố khác." và "Đây là lỗi biên dịch nếu một khai báo hàm tạo kiểu enum là public hoặc protected." (Ibid., 8.9.2)

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