簡體   English   中英

獲取對從枚舉類名實現接口的Java Enum的引用

[英]Get reference to Java Enum that implements an interface from enum class name

我想使用枚舉實現基本的狀態機; 枚舉實現一個接口來管理允許的狀態轉換。 但是我想在屬性文件中配置實現該接口的枚舉的類名列表,並應在特定上下文中使用。 上下文是在運行時確定的,並且該上下文鍵映射到屬性文件中的屬性鍵。 從屬性文件獲取上下文的枚舉的類名稱后,如何使用該類名稱通過接口方法獲取使用該枚舉的實例引用? 我可以看到您可以使用反射來發現特定枚舉的屬性,僅此而已。 有任何想法嗎?

您對使用反射是正確的:

  1. 從屬性文件中讀取類名稱后,請使用Class.forName獲取正確的Class對象。 確保輸入完整的類名。 您需要在此處捕獲各種檢查的異常。

  2. 請確保它是一個實現你的接口,與枚舉isEnum方法和使用isAssignableFrom從接口的方法Class對象。

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

  3. 使用靜態Enum.valueOf方法可從String獲取實際的枚舉常量,並將其Enum.valueOf轉換為接口。

     (YourInterface) Enum.valueOf(clazz, stringName) 

我寫了這個...可能對您有幫助:

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

是啊。

不要軟編碼這些東西,除非您真的很需要。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM