【发布时间】:2020-08-27 21:52:10
【问题描述】:
我在使用下一个代码时遇到了一些问题。 我有简单的界面,例如:
public interface Game {
int start();
}
许多实现此接口的类如:
public class FirstGame implements Game {
public static final int ID = 1;
@Override
int start() {
// Do something and return result
}
}
而 GameManager 类具有这样的一个方法:
public Game getGameById(int id) {
switch(id) {
case FirstGame.ID:
return new FirstGame();
case SecondGame.ID:
return new SecondGame();
// ..... and many other cases....
}
return null;
}
我试图使用反射来简化这个 switch-case 构造,如下所示: 注释:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface GameId {
long value() default 0;
}
FirstGame 类:
@GameId(value = 1)
public class FirstGame implements Game {
public static final int ID = 1;
@Override
int start() {
// Do something and return result
}
}
GameManager 方法是这样的:
public Game getGameById(int id) {
Game game = null;
try {
Reflections reflections = new Reflections();
for (Class<?> clazz : reflections.getTypesAnnotatedWith(GameId.class)) {
if (clazz.getAnnotation(GameId.class).value() == id) {
Constructor constructor = clazz.getConstructor();
game = (Game) constructor.newInstance();
break;
}
}
} catch (Exception ex) { ex.printStackTrace();}
return game;
}
但它运行得太慢了。 那么,如何以其他方式简化 switch-case 表达式呢? 感谢和抱歉英语不好。
【问题讨论】:
-
只执行一次并填充地图。考虑
ServiceLoader的机制 -
如果要在case标签中描述字段
ID,必须是final。 -
saka1029,你的权利。它出现在真实代码中,但不是问题示例。固定
标签: java performance optimization reflection