2012-05-19 52 views
7

Tôi có enum như thế nàyJava tùy chỉnh giá trị enum enum để

public enum Sizes { 
    Normal(232), Large(455); 

    private final int _value; 

    Sizes(int value) { 
     _value = value; 
    } 

    public int Value() { 
     return _value; 
    } 
} 

Bây giờ tôi có thể gọi Sizes.Normal.Value() để lấy giá trị số nguyên, nhưng làm thế nào để chuyển đổi giá trị số nguyên trở lại enum?

Những gì tôi làm bây giờ là:

public Sizes ToSize(int value) { 
    for (Sizes size : Sizes.values()) { 
     if (size.Value() == value) 
      return size; 
    } 
    return null; 
} 

Nhưng đó là cách duy nhất để làm điều đó? Đó là cách Java hoạt động?

+1

bản sao có thể có của [Java enum reverse look-up best practice] (http://stackoverflow.com/questions/5316311/java-enum-reverse-look-up-best-practice) – bmargulies

Trả lời

8

Có đó là cách thực hiện, thường bằng cách thêm phương thức tĩnh vào enum. Hãy suy nghĩ về nó; bạn có thể có 10 trường trên enum. Bạn có mong đợi Java để thiết lập tra cứu cho tất cả chúng?

Điểm ở đây là Java enums không có 'giá trị'. Họ có bản sắc và một thứ tự, cộng với bất cứ điều gì bạn thêm cho chính mình. Điều này chỉ khác với C#, mà sau C++ trong việc có một giá trị số nguyên tùy ý thay thế.

+2

Tôi đã cố gắng để đặt một HashMap vào enum của mình, nhưng nó xuất hiện mà bạn không được phép điền nó từ bên trong constructor enum. 1+ –

+0

Tôi vẫn thích cách C# xử lý enums. Nhanh hơn rất nhiều. Giả sử là một số nguyên Định danh, không phải toàn bộ lớp :) – xmen

+0

Bạn có thể cần phải khởi tạo nó trong một khối tĩnh. static private HashMap map = new HashMap ; và sau đó làm đặt trong ctor? – bmargulies

1

Đã lâu rồi kể từ lần cuối tôi làm việc với Java, nhưng nếu tôi nhớ chính xác, không có mối quan hệ nào giữa trường _value và thứ tự của enum. AFAIK bạn có thể có hai mục với cùng một _value, ví dụ. Như @bmargulies đã chỉ ra, bạn có thể có nhiều trường trong enum, và không có gì hạn chế bạn sử dụng các giá trị riêng biệt cho mỗi (hoặc tất cả) của chúng.

Xem thêm this related question. Rõ ràng, bạn không thể trực tiếp thiết lập thứ tự các mục của bạn.

+0

thats lý do tại sao tôi hỏi, tôi đã suy nghĩ có thể được xây dựng trong hỗ trợ trong java như C# nhưng tôi phải viết tất cả mọi thứ. Nó giống như làm việc trong C++ lol – xmen