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