2010-05-04 23 views
8

Perhap đây là một câu hỏi cơ bản đơn giảnCó cách nào giống như C để lấy số mặt hàng từ enum trong java không?

Có một enum

public enum TK{ 
     ID,GROUP,DATA,FAIL; 
     } 

Tôi có thể nhận được số thứ tự ví dụ ID = 0, GROUP = 2, DỮ LIỆU = 3, FAIL = 4?

Đây là cách để thực hiện điều đó, nhưng là một cách kỳ lạ và dài! = S

public enum TK{ 
     ID(0),GROUP(1),DATA(2),FAIL(3); 

     int num; 
     TK(int n) 
     { 
      this.num=n; 
     } 

     public int get() 
     { 
      return num; 
     } 

    }; 

để có được số vì vậy tôi viết TK.ID.get(), TK.GROUP.get(), vv ... Tôi không thích điều đó

có một cách tốt hơn ?

(C enums, C macros..I nhớ anh cả)

nhờ

+7

Vì vậy, nhiều câu trả lời, nhưng không ai bận tâm giải thích rằng bạn không nên sử dụng thứ tự trong hầu hết các trường hợp. Bạn không muốn chương trình của bạn phụ thuộc vào thứ tự của các giá trị enum của bạn. – Jorn

+3

@Jorn: Tài liệu API nói "... Hầu hết các lập trình viên sẽ không sử dụng phương pháp này. Nó được thiết kế để sử dụng bởi các cấu trúc dữ liệu dựa trên enum tinh vi, chẳng hạn như EnumSet và EnumMap." – Yaneeve

+0

Đôi khi nó không phải là xấu, trong trường hợp của tôi tôi cần phải enum Tiêu đề của một bảng csv vì vậy nếu điều này sẽ thay đổi là vì bảng đã làm, và đó không phải là rất có thể xảy ra, tại hầu hết các cột mới sẽ được thêm vào cuối, và thứ tự sẽ vẫn còn hữu ích Tôi nghĩ rằng –

Trả lời

7

Bạn đang tìm kiếm ordinal?

+1

Vâng, tôi đã tìm kiếm điều đó! (nó không để cho một mã sạch như C ...) nhưng tốt, đó là java haha, nhờ –

2

Bạn có thể sử dụng thứ tự()

1

http://java.sun.com/javase/6/docs/api/java/lang/Enum.html#ordinal()

public int thức thứ tự()
Trả về thứ tự của hằng số liệt kê này (vị trí của nó trong khai báo enum của nó, trong đó hằng số ban đầu được gán một thứ tự không). Hầu hết các lập trình viên sẽ không sử dụng phương thức này. Nó được thiết kế để sử dụng bởi các cấu trúc dữ liệu dựa trên enum phức tạp, chẳng hạn như EnumSet và EnumMap.

14

ordinal() thực hiện những gì bạn muốn làm. Đây là trích đoạn từ tài liệu:

Trả về thứ tự của hằng số liệt kê này (vị trí của nó trong khai báo enum, trong đó hằng số ban đầu được gán một thứ tự không). Hầu hết các lập trình viên sẽ không sử dụng phương thức này. Nó được thiết kế để sử dụng bởi các cấu trúc dữ liệu dựa trên enum phức tạp, chẳng hạn như EnumSetEnumMap.

Josh Bloch trong Effective Java 2nd Edition đi xa hơn để giải thích lý do tại sao sử dụng ordinal() là một ý tưởng khủng khiếp. Dưới đây là một số trích dẫn, được chỉnh sửa một chút:

Không bao giờ lấy được giá trị được kết hợp với enum từ thứ tự của nó; lưu trữ nó trong một trường thể hiện để thay thế. (Mục 31: Sử dụng các trường mẫu thay vì số thứ tự) Rất hiếm khi sử dụng các số thứ tự để lập chỉ mục mảng: sử dụng EnumMap để thay thế. Nguyên tắc chung là các lập trình viên ứng dụng nên hiếm khi, nếu có, sử dụng Enum.ordinal.(mục 33: Sử dụng EnumMap thay vì chỉ mục thứ)

cách "kỳ lạ và dài" của bạn một cách chính xác là toa khoản 31.

May mắn thay, Java không phải là C. Một Java enum rất mạnh mẽ và linh hoạt, được hỗ trợ bởi nhiều lớp thư viện và bạn nên học cách nắm bắt chúng thay vì sử dụng ordinal().

Hãy xem EnumMap chẳng hạn.

Triển khai Map chuyên biệt để sử dụng với các khóa loại 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. Enum Maps được biểu diễn bên trong dưới dạng mảng. Biểu diễn này cực kỳ nhỏ gọn và hiệu quả.

Đó là, thay vì những điều sau đây (mà có lẽ là những gì bạn muốn làm):

T[] arr = ...; 
TK tk = ...; 
T something = ...; 

arr[tk.ordinal()] = something; 

Bạn thay vì có thể làm:

Map<TK,T> map = new EnumMap<TK,T>(TK.class); 
TK tk = ...; 
T something = ...; 

map.put(tk, something); 

cuốn sách này cũng bao gồm một "truyền thống "(ab) sử dụng enum trong C, tức là các trường bit (gán quyền hạn của 2 cho mỗi hằng số, v.v.). Vâng, cho rằng Java có EnumSet thay thế.

+2

@polygenelubricants: +1 nhưng cũng giống như * "hầu hết các lập trình viên sẽ không sử dụng cho số IntegerOfLeadingZeros()" *. Tôi chắc chắn có rất nhiều sử dụng rất hợp lệ cho * ordinal() * và tôi rất vui vì không được * "hầu hết các lập trình viên" * :) – SyntaxT3rr0r

+1

+1 cảm ơn vì câu trả lời dài, tôi chỉ đọc "Java hiệu quả"! nhưng tôi vẫn chưa đạt được mục 33 !! =) –

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