2013-10-31 38 views
1

這可能嗎?我可以根據字符串的值來從一個類或另一個類實例化對象嗎?根據字符串的值從類A ... Z創建對象(可伸縮)

我有一個這樣的代碼:

public Map<Language, IConverter> converters; 

// ... 

public IConverter buildConverter(Language lang) { 
    IConverter converter = new ???(buildMap(lang)); <---- Problem here 

    converters.put(lang, converter); 
} 

public Map<Integer, String> buildMap(Language lang) { 
    // ... 
} 

哪裏Language是含有識別語言和IConverter是混凝土Converter由幾個(未定義量)實現的接口的字符串bean類。

我需要爲每個支持的Converter添加if子句嗎?無論如何,要確定哪個字符串屬於哪個類,可能帶有Map或類似的東西?

我可能會放棄Language類,因爲它有點淺,無法看到它的縮放。

編輯

我使用加斯帕的回答結束後,我不得不去適應我的Language類它包含完整的語言名稱,和連接的包名,languagename和「轉換器」。

男孩,起初是反思,很多很多例外。

+3

[GoF的德興模式的示例](http://stackoverflow.com/a/2707195/1654265):看一看***創建模式*** 。 –

+0

您能否給我們提供if語句的示例代碼,以便我們更好地理解它? thnx – Apostolos

回答

1

如果您在字符串中擁有該類的名稱,則可以使用reflection創建它的新實例。例如:

String className = "com.mycompany.SomeConverter"; 

// Creates an instance of the class by using the no-args constructor 
IConverter converter = (IConverter) Class.forName(className).newInstance(); 

如果你想使用帶有參數的構造函數具體:

// For example, look for a constructor that takes one argument, a String 
Constructor constr = Class.forName(className).getConstructor(String.class); 

// Create a new instance, passing "Hello" as the argument 
IConverter converter = (IConverter) constr.newInstance("Hello"); 
+0

是的,我正在尋找這樣的事情。可悲的是,我不得不重建我的小項目中的大部分內容。我會將此標記爲已接受的答案。 – Alxe

0

可能是你需要非常相似this東西。

0

我猜你的意思是這

Constructor constr = Class.forName("com.yourpackage.converter" + lang.getYourString()).getConstructor(buildMap_function_returned_class.class); 

IConverter converter = (IConverter) constr.newInstance(buildMap(lang));