在Array / Collection的每个索引上调用不同的Object的构造函数

时间:2016-12-02 22:41:25

标签: java arrays collections foreach constructor

我正在尝试整理我的代码,因为在我的程序准备完成任务之前,我需要初始化许多不同的类。 它们都是可选的,可能会失败,但其中一个必须成功 所有这些类都实现了一个名为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);
 }
}

有没有办法在数组或Collection中放置一些内容,以便可以使用for语句调用它们?

(将它们放入HashMap的原因是因为它们的方法是针对每个HashMap.keySet()运行的,我需要记录可能的错误)
提前谢谢!

3 个答案:

答案 0 :(得分:0)

您可以将所有Hook个对象添加到List,然后使用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);
            }
        }
     }

答案 1 :(得分:0)

我建议使用反思:

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

或者如果您使用的是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);
    }
}

然后你可以从hashmap获取你的实例。

答案 2 :(得分: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() );
        }

如果您关心订单,则需要LinkedHashMap,否则只需Map任何类型。