2016-12-02 3 views
0

私は自分のコードを整理しようとしています。私は自分のコードを整理しようとしています。
これらはすべてオプションですが失敗する可能性がありますが、そのうちの1つが成功する必要があります。
これらのクラスはすべて、Hookというインターフェースを実装しています。配列/コレクションの各インデックスで別のオブジェクトのコンストラクタを呼び出す

各初期化はHashMapのに入れて、ここでの例です:

HashMap<String, Hook> hooks = new HashMap<>(); 
String key = "Fish"; 
if (isEnabled(key)) { 
try { 
    hooks.put(key, new FishStoreHook()); 
} catch { 
    logError(key); 
} 
} 

しかし、今、私はパンと言う、のためのもう一つ持っている必要があります:

key = "Bread"; 
if (isEnabled(key)) { 
try { 
    hooks.put(key, new BreadStoreHook()); 
} catch { 
    logError(key); 
} 
} 

配置する方法はありますが配列やコレクションの中の何かを使って、それぞれのステートメントでaを使って呼び出すことができますか?

(なぜなら、それらのメソッドはそれぞれのHashMap.keySet()に対して実行され、起こりうるエラーを記録する必要があるからです)
ありがとうございます!

答えて

0

私はリフレクションを使用することをお勧めしたい:

String className = "package.name." + key + "StoreHook"; 
Class<Hook> clazz = (Class<Hook>) YourClass.class.forName(className); 
Hook hook = clazz.newInstance(); 

OR Springを使用している場合は、Hookのすべてのサブタイプも取得できます。

ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); 
provider.addIncludeFilter(new AssignableTypeFilter(Hook.class)); 
Set<BeanDefinition> definitions = provider.findCandidateComponents("package/name"); 

Map<String, Hook> hooks = new HashMap<>(); 
for (BeanDefinition definition : definitions) { 
    try { 
     Class clazz = Class.forName(definition.getBeanClassName()); 
     hooks.put(clazz.getSimpleName(), clazz.newInstance()); 
    } catch (ClassNotFoundException e) { 
     logger.error("Unable to get class: ", e); 
    } 
} 

次に、ハッシュマップからインスタンスを取得できます。

+1

反射が完璧に働いてくれてありがとう! :) コードを150行から17に減らしました。 私のコンストラクタは引数を持っていましたが、私はそれを実行することができました 'clazz.getConstructor(Plan.class).newInstance(this)' –

0

あなたはListにすべてHookオブジェクトを追加し、インラインコメントを次のコードに示すようfor-eachを使用することができます。

List<Hook> hooks = new ArrayList<>(); 
hooks.add(new FishStoreHook("Fish"));//Pass HookName as a constructor arg 
hooks.add(new BreadStoreHook("Bread"));//Pass HookName as a constructor arg 
//add other hook objects 

//Now iterate all the hook objects using foreach 
for(Hook hook : hooks) { 
    if(isEnabled(hook.getName())) {//get HookName (set through constrcutor above) 
    try { 
      hooks.put(key, hook); 
     } catch { 
       logError(key); 
      } 
     } 
    } 
+0

ああ、ありがとうございます。たぶん私ははっきりしていないかもしれませんが、コンストラクタを呼び出すと、オプションのライブラリである別の.jarからメソッドを使用しようとします。ライブラリが存在しない場合、コンストラクタを実行するとエラーがスローされます。 –

0
@SuppressWarnings("serial") 
    final Map<String, Callable<Hook>> init = 
     new LinkedHashMap<String, Callable<Hook>>() {{ 
      put("Fish", new Callable<Hook>() { 
       @Override public Hook call() throws Exception { 
        return new FishStoreHook(); }}); 
      put("Bread", new Callable<Hook>() { 
       @Override public Hook call() throws Exception { 
        return new BreadStoreHook(); }}); 
     }}; 

    final Map<String, Hook> hooks = new HashMap<>(); 
    for(Map.Entry<String, Callable<Hook>> e: init.entrySet()) 
     try { 
      if(isEnabled(e.getKey())) 
       hooks.put(e.getKey(), e.getValue().call()); 
     } catch(Exception ex) { 
      logError(e.getKey()); 
     } 

あなたはそうMapのただの種類はどうしたら、あなたは順序を気にした場合のLinkedHashMapを必要としています。

関連する問題