获取对枚举类名实现接口的Java Enum的引用

时间:2013-06-25 21:14:18

标签: java

我想使用枚举实现一个基本的状态机;枚举实现了一个界面来管理允许的状态转换。但是我想在属性文件中配置实现接口的枚举的类名列表,并且应该在特定的上下文中使用。上下文在运行时确定,并且该上下文键映射到属性文件中的属性键。从属性文件中获取上下文的枚举类名后,如何使用该类名获取实例引用以通过接口方法使用该枚举?我可以看到你可以使用反射来发现特定枚举的属性,但就是这样。有任何想法吗?

3 个答案:

答案 0 :(得分:1)

你正确使用反射:

  1. 从属性文件中读取类名后,使用Class.forName获取正确的Class对象。确保传入完全限定的类名。您需要在此处捕获各种已检查的例外情况。

  2. 使用isEnum方法并使用界面isAssignableFrom对象中的Class方法确保它是实现界面的枚举。

    isEnum()&& YourInterface.class.isAssignableFrom(clazz中)

  3. 使用静态Enum.valueOf方法从String获取实际枚举常量并将其强制转换为您的界面。

    (YourInterface) Enum.valueOf(clazz, stringName)
    

答案 1 :(得分:1)

我写了这个......它可以帮到你:

public class MyTests {

  static enum XX implements Runnable {
    A, B;
    public void run() {
      System.out.println( "I'm enum value: " + this.name() );
    }
  }

  public static void main( String[] args ) throws Exception {
    new MyTests();
  }

  public MyTests() throws Exception {
    Class<?> loaded = Class.forName("MyTests$XX");
    Class<? extends Runnable> xx = loaded.asSubclass(Runnable.class);
    Runnable[] enumConstants = xx.getEnumConstants();
    for ( Runnable runnable : enumConstants ) {
      runnable.run();
    }
  }

}

这将打印:

I'm enum value: A
I'm enum value: B

答案 2 :(得分:0)

呀。

不要软编码那些东西,除非你真的真的需要。

http://thedailywtf.com/Articles/Soft_Coding.aspx