2011-09-01 111 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含有红色