2017-03-14 73 views
-1

在我的項目中,我正在使用需要讀取ID的函數,以獲取下一個要調用哪個函數的信息或爲每個ID獲取唯一名稱。 到目前爲止,我一直在下面的switch case聲明中寫下所有這些信息。用文本文件/數據庫替換大型開關櫃[Java]

switch(ID) 
{ 
case 1: functionA() 
...... 
case 400: functionZ() 
} 

我寧願做這樣的文本文件或在那裏我可以訪問此信息和編輯它只是像一個逗號分隔的文件或SQL數據庫的數據庫。 也很重要的一點是,這種開關箱經常使用,因此速度有點重要。

我的問題是用什麼樣的方法來取代這個。

+0

問題是? – lexicore

+0

哪些替代方案有大型開關櫃 – Lethalbeast

回答

0

你可以像Map<Integer, Runnable> actions一個農業綜合整治開發替代交換機的對象。那麼你可以只是actions.get(id).run()

棘手的部分是你如何初始化這張地圖。

鍵很瑣碎,你可以直接定義它們。值(那些Runnable s)很棘手。你如何定義functionAfunctionZ以可序列化的形式?可能有很多選擇。例如,您可以將每個函數實現爲一個單獨的類,然後序列化類名。然後,您可以配置在這樣一個CSV文件,您的switch語句:

id,className 
1,com.acme.foo.FunctionA 
400,com.acme.foo.FunctionZ 

FunctionX實現Runnable(或任何其他合適的接口)。加載CSV文件時,您將通過反射創建類的實例(Class.forName(className).newInstance)。你的交換機就像actions.get(id).run()一樣簡單(好吧,一些空的檢查會很好)。

初始化後,這將非常快,你不應該看到與switch語句有很大區別。

+0

這看起來正是我所需要的,我會在1小時內接受這個答案,讓其他人有機會提出另一個建議。 – Lethalbeast

0

您可以使用reflections來做到這一點:

讓我們你的名字你的功能功能1,功能2,......他們對應的ID 1,2,...,等等。我們也說,他們不要採取任何論據,並返回無效。

java.lang.reflect.Method method; 
try { 
    String methodName = "function" + ID; 
    method = obj.getClass().getMethod(methodName); 
    method.invoke(obj); 
} catch (SecurityException e) { ... } 
    catch (NoSuchMethodException e) { ... } 

這裏obj是包含這些方法的功能1,功能2類等

+0

這看起來像是一個很好的方法,但對於讀取名稱,這是行不通的,因爲每個名稱都是唯一的。 (在回答中編輯姓名的東西) – Lethalbeast