1

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

4

3 回答 3

1

你是对的使用反射:

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

  2. 确保它是一个实现您的接口的枚举,使用isEnum方法并使用isAssignableFrom接口Class对象中的方法。

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

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

    (YourInterface) Enum.valueOf(clazz, stringName)
    
于 2013-06-25T21:23:23.757 回答
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
于 2013-06-25T21:28:12.507 回答
0

是的。

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

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

于 2013-06-25T23:12:45.107 回答