2011-09-01 199 views
2

我有一些枚舉枚舉,每個枚舉都包含要測試的屬性名稱。我遇到的問題是如何爲對象選擇相關的枚舉。我怎樣才能定義一個枚舉變量,它貫穿我的代碼,可以通過initalise方法設置。選擇正確的枚舉

編輯:

對不起,延遲響應。我不得不離開辦公桌

這很糟糕的設計。我有幾個枚舉如下:

public enum AccountGrpEnum { 
    Account("Account"), 
    AccountType("AccountType"), 
    AcctIDSource("AcctIDSource"); 

    private static Set<String> grpNames = new HashSet<String>(3) {{  
     for(AccountGrpEnum e : AccountGrpEnum.values()) {   
      add(e.toString());  
     }  
    }}; 

    public static boolean contains(String name) {  
     return grpNames.contains(name);  
    } 

    private String name; 

    private AccountGrpEnum(String name) { 
     this.name = name; 
    } 

    public String toString() { 
     return this.name; 
    } 

} 

另一個Enum

public enum BlockManValEnum { 

    avgPx("avgPx"), 
    quantity("quantity"), 
    securityIDSource("securityIDSource"), 
    securityID("securityID"), 
    blockStatus("blockStatus"), 
    side("side"); 

    private static Set<String> names = new HashSet<String>(9) {{  
     for(BlockManValEnum e : BlockManValEnum.values()) {   
      add(e.toString());  
     }  
    }}; 

    public static boolean contains(String name) {  
     return names.contains(name);  
    } 

    private String name; 

    private BlockManValEnum(String name) { 
     this.name = name; 
    } 

    public String toString() { 
     return this.name; 
    } 

} 

在我的代碼,我檢查傳入對象的字段,看看它們都包含在枚舉內。具體如下:

if (BlockManValEnum.contains(fields[i].getName())) 

但是我想它沿着哪裏variableEnum可以在運行時設置的

if (variableEnum.contains(fields[i].getName())) 

線是。

希望這是更清晰的傢伙

+1

你能否提供一些更具體的細節? –

+1

你的問題不是很清楚。 ** a)**似乎數字應該是小寫,除非您正在談論一個沒有意義的數字對象。 ** b)**如果您發佈有問題的代碼或示例代碼來完成相同的任務,那麼回答您會容易得多。你能做這個嗎? (越早越好,對問題的評價可能會比較快,您可能想要[刪除]您的問題,並再次發佈更詳細的信息。) –

+0

老實說?我不明白你是什麼意思:)但對我來說,它看起來是一個非常醜陋的測試設計。 –

回答

1

使用Enum.valueOf

Enum<?> variableEnum = AccountGrpEnum.class; 
if(Enum.valueOf(variableEnum.getClass(), field[i].getName()) != null) { 
    doSomething(); 
} 
+0

,但一些枚舉有共同的屬性。它將如何知道使用正確的Enum? – Will

+0

查看上面的編輯。你可以使用任何你想要的枚舉類型。 if語句與你的if(BlockManValEnum.contains(fields [i] .getName()))和if(variableEnum.contains(fields [i] .getName()))'完全相同。 – Daniel

2

建立在以前的答案。

enum Color { 
    RED(1), 
    GREEN(2), 
    BLUE(3); 

    int attrib; 

    Color(int attribValue) { 
     attrib = attribValue; 
    } 

    public Color getColorForAttrib(int attribValue) { 
     for(Color c : Color.values()) { 
      if(c.attrib == attribValue) { 
       return c; 
      } 
     } 
     throw new IllegalArgumentException("No color could be found for attrib of value " + attribValue); 
    } 
} 

... 


class SomeClass { 
    Color c; 
    public void SomeClass(Color c) { 
     this.c = c; 
    } 
} 

... 

class SomeClassUser { 
    public static void main(String[] args) { 
     Color c = Color.getColorForAttrib(Integer.valueOf(args[i])); 
     new SomeClass(c); 
    } 
} 

請記住,簡單地說,枚舉只是一個類,所以你可以添加你想要的任何方法。無論它是否是一個好主意取決於環境

0

由於枚舉類,因此可以實現接口,您可以創建持有的包含一個接口()方法然後在你的枚舉上實現該方法,然後使用一個通用方法,該方法接受一個實現該接口的特定枚舉類型的類標記(並且可以在運行時設置該標記)以進行測試。事情是這樣的:

CanBeTestedForContains:

public interface CanBeTestedForContains { 
    boolean contains(String name); 
} 

ColorEnum:

import java.util.HashSet; 
import java.util.Set; 

public enum ColorEnum implements CanBeTestedForContains { 
    R("red"), 
    B("blue"); 

    private static Set<String> names = new HashSet<String>(3) { 
    { 
     for (final ColorEnum e : ColorEnum.values()) { 
     add(e.name); 
     } 
    } 
    }; 

    private String name; 

    private ColorEnum(final String name) { 
    this.name = name; 
    } 

    @Override 
    public boolean contains(final String name) { 
    return names.contains(name); 
    } 
} 

SuitEnum:

import java.util.HashSet; 
import java.util.Set; 

public enum SuitEnum implements CanBeTestedForContains { 
    D("diamonds"), 
    H("hearts"), 
    C("clubs"), 
    S("spades"); 

    private static Set<String> names = new HashSet<String>(3) { 
    { 
     for (final SuitEnum e : SuitEnum.values()) { 
     add(e.name); 
     } 
    } 
    }; 

    private String name; 

    private SuitEnum(final String name) { 
    this.name = name; 
    } 

    @Override 
    public boolean contains(final String name) { 
    return names.contains(name); 
     } 
} 

ContainsSelectorTest:

public class ContainsSelectorTest { 
    private static <E extends Enum<E> & CanBeTestedForContains> boolean contains(final Class<E> enumClass, final String name) { 
    return enumClass.getEnumConstants()[0].contains(name); 
    } 

    public static void main(final String[] args) { 
    if (contains(ColorEnum.class, "red")) { 
     System.out.printf("%s contains %s\n", ColorEnum.class, "red"); 
    } 

    if (contains(SuitEnum.class, "hearts")) { 
     System.out.printf("%s contains %s\n", SuitEnum.class, "hearts"); 
    } 

    if (contains(SuitEnum.class, "red")) { 
     System.out.println("This shouldn't happen."); 
    } else { 
     System.out.printf("%s DOES NOT contain %s\n", SuitEnum.class, "red"); 
    } 
    } 
} 

輸出:

類ColorEnum包含紅色

類SuitEnum包含心中類

類SuitEnum DOES NOT含有紅色