2011-12-05 49 views
5

enum của tôi là như hiện nay:Thiết giá trị của kiểu liệt kê, và phân tích chuỗi để có được một enum

public enum Manufacturers { 
    Honda, 
    GM, 
    Toyota, 
    Ferrari 
} 

tôi cần phải tạo ra một HashMap vì vậy tôi có kế hoạch làm điều này, điều này có đúng không?

Manufacturers mfg = Manufacturers.Honda; 

mfg.ordinal() // save as key 

tức là tôi sẽ lưu giữ chìa khóa bằng cách sử dụng enumInstance.ordinal()

Ngoài ra, tôi cần để có thể phân tích một chuỗi đó sẽ là giá trị thứ thuộc kiểu liệt kê, và nhận được một enum lại:

Manufacturers mfg = Manufacturers.valueOf(mfgOrdinalValueAsString); 

Ở trên đã cho tôi một lỗi (chuỗi là "1"). Đây có phải là cách chính xác không? Tôi đoán tôi nên có một thử/bắt trong đó phải không?

Trả lời

2

.valueOf thực sự mong đợi chuỗi "GM" (cho 1).

Để lưu trữ các giá trị enum của bạn trong bản đồ, hãy sử dụng EnumMap được thiết kế riêng cho điều này - và cũng sẽ nhanh chóng sử dụng nó.

Nếu bạn thực sự muốn tham chiếu giá trị theo thứ tự của nó, hãy sử dụng thứ gì đó như Manufacturers.values()[1].

+0

Tôi dường như không thể đặt giá trị thứ tự một cách rõ ràng, tôi đã thử: GM ("5"), Toyota ("6") – Blankman

+1

Không, bạn không thể đặt chúng - các đơn vị sẽ khớp với thứ tự mà các giá trị được khai báo bên trong enum. – ziesemer

+1

Nếu vì lý do nào đó, bạn cần một số 'int' khác nhau liên quan đến mỗi phần tử của enum (trừ thứ tự được gán tự động), bạn luôn có thể thêm nó làm thuộc tính cho enum, cùng với getters –

2

Một gợi ý: tốt hơn sử dụng name() để có được những tên của enum như một String, và bất cứ khi nào bạn cần phải lấy lại gốc Enum từ nó, sử dụng phương pháp valueOf() - kể từ valueOf() hy vọng tên, không thứ tự, như một tham số. Ví dụ:

enum Example {ONE, TWO}; 

String name = Example.ONE.name(); 
Example e = Example.valueOf(Example.class, name); // e has value ONE 

Nếu bạn chắc chắn cần phải sử dụng thứ tự, phương pháp ordinal() sẽ trả về một chỉ số mà bạn có thể sử dụng để lấy tương ứng Enum từ mảng trả về bởi phương pháp values(). Như thế này:

int ordinal = Example.ONE.ordinal(); 
Example e = Example.values()[ordinal]; // e has value ONE 

Như đã được chỉ ra, xem xét sử dụng EnumMap, như đã nêu trong tài liệu, nó là

Một Bản đồ chuyên ngành thực hiện để sử dụng với các phím kiểu enum. Tất cả các khóa trong bản đồ enum phải đến từ một loại enum được chỉ định, rõ ràng hoặc ngầm định, khi bản đồ được tạo ra. Các bản đồ Enum được biểu diễn nội bộ dưới dạng mảng. Biểu diễn này cực kỳ nhỏ gọn và hiệu quả.

EDIT

Nếu bạn cần phải kết hợp một mã khác nhau cho mỗi yếu tố của enum (trừ thứ tự tự động gán nó), bạn luôn có thể thêm nó như là một thuộc tính để enum, cùng với getter và setter, như thế này:

public enum Manufacturers { 

    Honda(10), 
    GM(20), 
    Toyota(30), 
    Ferrari(40); 

    private int code; 

    Manufacturers(int code) { 
     this.code = code; 
    } 

    public int getCode() { 
     return code; 
    } 

    public void setCode(int code) { 
     this.code = code; 
    } 

} 

Ví dụ:

Manufacturers m = Manufacturers.Honda; 
System.out.println(m.getCode()); // prints 10 
m.setCode(100); 
System.out.println(m.getCode()); // prints 100 

Chỉ cần lưu ý rằng bạn sẽ không thể tạo lại đối tượng Enum từ thuộc tính code, vì thuộc tính đó được xác định bởi lập trình viên.

+0

để bạn chỉ có thể truyền sử dụng tên chứ không phải giá trị thứ tự? – Blankman

+0

Đúng vậy, để lấy enum chỉ sử dụng thứ tự, sử dụng 'values ​​()'. Tôi đã cập nhật câu trả lời của mình bằng các ví dụ về mã. –

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