2012-02-17 64 views
7

Khi tôi cố gắng sử dụng enum để lưu trữ: "=", ">", "<", vân vân, tôi có:Làm thế nào để sử dụng enum với các giá trị trong Java

public static enum DataValueModifier { 
    EQUAL("="), 
    GREATER_THAN(">"), 
    GREATER_EUQAL(">="), 
    LESS_THAN("<"), 
    LESS_EQUAL("<="), 
    APPRROXIMATE("~"), 
    NOT_DETERMINED("ND"); 
    private String value; 
    private DataValueModifier(String value) { 
     this.value = value; 
    } 
    public String getValue() { 
     return value; 
    } 
} 

Làm thế nào để sử dụng nó khi tôi cố gắng để so sánh một chuỗi để xem nếu nó có chứa một "=" đăng nhập, tôi nên làm:

if (dataValue.contains(DataValueModifier.EQUAL.getValue())) { 
... 
} 

tôi hiểu sử dụng enum là thực hành tốt hơn ở đây, nhưng điều này chỉ trông ngớ ngẩn ... Cảm ơn,

David

+0

bạn nên so sánh nó như 'DataValueModifier.EQUAL.getValue() equals (dataValue)' và Enums là tốt hơn cho một cái gì đó như các ngày trong tuần ('Day.MONDAY, Day.TUESDAY và on) và thực hiện so sánh chuyển đổi. –

+0

có vẻ ổn với tôi - Tôi đã thiết lập nó như Paul nói dưới đây, nhưng nếu không nó rõ ràng và không nhìn tất cả những ngớ ngẩn ... –

+0

Tôi giả sử dataValue là một String? Nếu vậy, bạn sẽ có thể ghi đè 'DataValueModifier.toString()' và chỉ làm điều này: 'dataValue.contains (DataValueModifier.EQUAL) ' Nếu bạn cũng nhập tĩnh như Paul gợi ý, nó sẽ biến thành' dataValue.contains (EQUAL) ' – KJP

Trả lời

2

Trước hết, tôi muốn di chuyển "chứa "phương thức (hoặc tương đương của nó) với chính enum bằng cách định nghĩa phương thức isModifier.

public static enum DataValueModifier { 

    ... 

    public boolean isModifier(String modifierString) 
    { 
     return modifierString != null && value.equals(modifierString); 
    } 
} 

Sau đó, mã của bạn trông giống như thay vì điều này:

if (DataValueModifier.EQUAL.isModifier(dataValue)) 
{ 
    //... 
} 

Nhưng, quan trọng hơn, tại sao bạn đang sử dụng dataValue thay vì enum ở nơi đầu tiên? Nếu bạn đang nhận được đầu vào dòng lệnh hoặc một cái gì đó hoặc phân tích cú pháp một phương trình chuỗi và sau đó cần phải tìm ra biểu thức tôi đoán tôi hiểu. Nhưng nếu bạn có quyền kiểm soát của mã sau đó bạn chỉ nên bắt đầu với enum và bạn sẽ có thể nói

if (dataValueEnum == DataValueModifier.EQUAL) { 
{ 
    //... 
} 

Tôi cũng cân nhắc việc thêm một phương pháp tĩnh để enum có thể chuyển đổi một chuỗi trao cho các giá trị enum chính xác. Nó không phải là khá hiệu quả, có lẽ, nhưng trừ khi bạn thực sự quan tâm về hiệu quả nó sẽ làm cho mã của bạn sạch hơn nhiều. Vì vậy, thêm phương pháp này để enum của bạn:

public static DataValueModifier toDataValueModifier(String dataValue) { 
    if(EQUAL.isModifier(dataValue) { 
     return EQUAL; 
    } else if(GREATER_THAN.isModifier(dataValue) { 
     return GREATER_THAN; 
    } else if... 
     // Do this for all possible values 
    } else { 
     return UNKNOWN; 
     // Also, add an UNKNOWN to your list of enum values. 
    } 
} 

Các isModifiertoDataValueModifier phương pháp có thể thêm vào một chút mã xấu xí để enum DataValueModifier của bạn, nhưng tất cả các mã khác của bạn sẽ trông tuyệt vời. Bây giờ bạn có thể làm một cái gì đó như thế này:.

DataValueModifier dataValueEnum = DataValueModifier.toDataValueModifier(dataValue); 
if (dataValueEnum == DataValueModifier.EQUAL) { 
    ... 
} 

hoặc thậm chí

switch(DataValueModifier.toDataValueModifier(dataValue)) { 
    case EQUAL: 
     // ... 
     break; 
    case GREATER_THAN: 
     // ... 
     break; 
    case GREATER_EQUAL: 
     // ... 
     break; 
    // ... define all the cases you want 
    case UNKNOWN: 
    default: 
     // ... 
} 
+0

Tôi đang phân tích chuỗi trong trường hợp này, nhưng phương thức isModifier không kiểm tra "chứa" trong mã của bạn –

2

Tôi thích sử dụng một số static import trong những trường hợp này.

package mypackage; 

public enum DataValueModifier 
{ 
    //your enum code 
} 

sau đó ...

import static mypackage.DataValueModifier.*; 

public MyClass 
{ 

    // code blah blah blah 

    public void doIt() 
    { 
    // more code blah blah 
    if (dataValue.contains(EQUAL.getValue())) 
    { 
     //... 
    } 
    } 
} 

Đó là một chút đẹp hơn.

+0

nếu nó là riêng tư thì sao? –

+0

Bạn sẽ phải sử dụng tên enum sau đó. – Paul

4

Nếu bạn định nghĩa một phương pháp boolean containedIn(String str) trong enum của bạn và nhập giá trị enum mà bạn quan tâm (trong trường hợp này EQUAL), sử dụng sẽ như thế nào:

if (EQUAL.containedIn(dataValue)) { 
... 
} 
Các vấn đề liên quan