2009-07-29 31 views
5

Trên tất cả các dự án của chúng tôi, chúng tôi có loại enums này. Chúng hoạt động tốt, nhưng chúng tôi không chắc chắn về chúng.là Danh sách của tôi có đúng không?

Đặc biệt với phương thức getDocumentType (String).

Có cách nào để tránh lặp lại trên tất cả trường Enums không?

public enum DocumentType { 

    UNKNOWN("Unknown"), 
    ANY("Any"), 
    ASSET(Asset.class.getSimpleName()), 
    MEDIA(Media.class.getSimpleName()), 
    MEDIA35MM(Media.class.getSimpleName() + " 35mm"); 


    private String label; 

    private DocumentType(String label) { 
     this.label = label; 
    } 

    public String getLabel() { 
     return label; 
    } 

    public static DocumentType getDocumentType(String label){ 
     for(DocumentType documentType : DocumentType.values()){ 
      if(documentType.getLabel().equals(label)){ 
       return documentType; 
      } 
     } 
     return UNKNOWN; 
    } 
} 

Chỉnh sửa: Kiểm tra phản hồi mới. Cô ấy cũng khỏe.

+1

Thật hấp dẫn để lưu trữ một bản đồ tĩnh của nhãn cho trường hợp enum, nhưng bực bội, java sẽ không cho phép bạn tham chiếu trường tĩnh từ hàm tạo của enum. – skaffman

+1

Tôi tự hỏi tại sao bạn sử dụng Asset.class.getSimpleName() thay vì chỉ viết "Tài sản"? Bạn có kế hoạch thay đổi tên bằng cách tái cấu trúc không? – akarnokd

+1

Bởi vì luôn luôn thực hành tốt để sử dụng chữ lớp thay vì chuỗi? – skaffman

Trả lời

5

Bạn sẽ phải thực hiện lặp lại ở đâu đó, do các hạn chế trong việc viết enums. Trong một thế giới lý tưởng, bạn sẽ tạo một Bản đồ tĩnh từ bên trong hàm tạo của DocumentType, nhưng điều đó không được phép.

Điều tốt nhất tôi có thể đề nghị được thực hiện lặp đi lặp lại một lần trong một initializer tĩnh, và lưu trữ các enums trong một bảng tra cứu:

public enum DocumentType { 

    .... existing enum stuff here 

    private static final Map<String, DocumentType> typesByLabel = new HashMap<String, DocumentType>(); 
    static { 
     for(DocumentType documentType : DocumentType.values()){ 
      typesByLabel.put(documentType.label, documentType); 
     } 
    } 

    public static DocumentType getDocumentType(String label){ 
     if (typesByLabel.containsKey(label)) { 
      return typesByLabel.get(label); 
     } else { 
      return UNKNOWN; 
     } 
    } 
} 

Ít nhất bạn sẽ không được làm lặp mọi thời gian, mặc dù tôi nghi ngờ bạn sẽ thấy bất kỳ cải thiện hiệu suất có ý nghĩa nào.

+0

+1 Chỉ là những gì tôi đã nghĩ đến, bạn đánh bại tôi mặc dù =) – mikek

+1

Tôi chỉ mất 10 phút hoặc hơn để hét vào trình biên dịch – skaffman

+0

Nếu có 100 phần tử trong enum (hoặc thậm chí là nghìn) thì đây có thể là một cải tiến hiệu suất ...có thể, đặc biệt là nếu bạn đang tìm kiếm rất nhiều. – aperkins

1

Theo như tôi biết (Đối với những gì nó có giá trị), đó là cách tốt nhất để làm những gì bạn muốn.

Đó là cách tôi sẽ làm điều đó ít nhất.

Nếu số lượng enum tăng đáng kể (vài trăm nghìn), bạn có thể muốn thêm Map ing của Strings để enums để tìm kiếm nhanh hơn một chút. Nhưng đối với số lượng nhỏ eunums bạn có, điều này có thể là quá mức cần thiết.

1

Có vẻ ổn với tôi.

Tôi sẽ để nguyên bản lặp lại. Chắc chắn bạn có thể thêm một bản đồ < 'nhãn', 'DocumentType'> triển khai vào lớp enum và thực hiện tra cứu nhưng nó sẽ không làm tăng hiệu suất đáng kể.

1

Nếu chuỗi được biết tại thời gian biên dịch, và nếu họ là những định danh hợp lệ, bạn chỉ có thể sử dụng chúng như tên của các enums trực tiếp:

public enum DocumentType { Unknown, Any, Asset, Media, Media35mm } 

và sau đó nhận được nó bằng cách .valueOf(). Ví dụ:

String label = "Asset"; 
DocumentType doctype; 
try { 
    doctype = DocumentType.valueOf(label); 
} catch (IllegalArgumentException e) { 
    doctype = DocumentType.Unknown; 
} 
+0

Một đồng nghiệp đang đi cùng một giải pháp. Nó là tốt cho hầu hết thời gian, không phải trong trường hợp chính xác của chúng tôi, nhưng cho lặp tiếp theo sẽ kiểm tra xem chúng tôi thực sự nead một định danh và một nhãn. –

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