2017-03-14 15 views
-1

私のプロジェクトでは、次に呼び出す関数や各IDの固有の名前を取得するための情報を取得するために、IDを読み取る必要がある関数を扱っています。 これまでのところ、私はこのような情報を以下のようなswitch case文に記述してきました。大規模なスイッチケースをテキストファイル/データベースで置き換える[Java]

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

私は、テキストファイルまたは私はこの情報にアクセスし、簡単にカンマ区切りファイルまたはSQLデータベースと同じように編集することができ、データベースにこの操作を行うことを好むだろう。 重要なことは、このスイッチのケースがよく使用されるため、速度がいくらか重要であるということです。

私の質問はこれを置き換えるためにどのような方法が使用できるのですか?

+0

質問は? – lexicore

+0

大型のスイッチケースにはどのような代替方法がありますか – Lethalbeast

答えて

0

これらの方法で機能1、機能2を含むクラスなどの目的です。それでは、ちょうどactions.get(id).run()です。

この地図をどのように初期化するのが難しい部分です。

キーは簡単ですが、キーをそのまま定義することもできます。値(それらのRunnable秒)は扱いにくいです。 functionAまたはfunctionZをシリアル化可能な形式でどのように定義しますか?多くのオプションがあります。たとえば、それぞれの関数を別々のクラスとして実装し、クラス名をシリアライズすることができます。その後、のようなCSVファイルであなたのswitch文を設定できます。

id,className 
1,com.acme.foo.FunctionA 
400,com.acme.foo.FunctionZ 
FunctionXRunnableを実装

(または任意の他の適切なインタフェース)。 CSVファイルを読み込むときには、リフレクション(Class.forName(className).newInstance)でクラスのインスタンスを作成します。スイッチはactions.get(id).run()とシンプルになります(いくつかのヌルチェックは良いでしょう)。

初期化後、これはかなり高速になります。switch文との違いはほとんどありません。

+0

これは私が必要としているもののように見えます。私はこの答えを1時間で受け入れて、他の人に別の提案をする機会を与えます。 – Lethalbeast

0

あなたもそれを行うにはreflectionsを使用することができます。

ましょうのも、彼らましょうなど、あなたは、関数1、関数2としてあなたの関数に名前を付ける...そして、彼らはIDが1に対応し、2、...引数を取ってvoidを返さないでください。ここで

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はあなたがMap<Integer, Runnable> actionsのようなconsructionであなたのスイッチを置き換えることができ

+0

これは機能にとっては良い方法のようですが、名前を読み取るにはそれぞれの名前が一意であるため動作しません。 – Lethalbeast

関連する問題