我一直在用 Java 开发一个关卡读取器,它可以从我的游戏的 XML 文档中提取关卡数据。一切都很顺利,但我遇到了一个问题。我从文档中提取的一件事是要创建的游戏对象的 ID。我有很多类,例如墙、玩家和硬币,所有这些都扩展了 GameObject 类。我希望 GameObject 类中有一个方法可以根据 ID 返回 GameObject。像这样的事情:
public GameObject CreateGameObject(int id, int x, int y, GameScreen parent) {
Type type = getTypeFromList(id);
Type gobj = new Type(x,y,parent);
return gobj;
}
我知道我可以使用一堆 if 语句检查 ID 并返回正确的 ID 来完成此操作,但我希望代码干净且更通用。如果您可以的话,请帮助告诉我如何做到这一点或告诉我另一种方式,我们将非常感激。
最佳答案
我建议使用工厂接口(interface)来创建 GameObject
,并为每种类型提供一个实现(例如 arynaq mentioned in the comments ):
interface GameObjectFactory {
GameObject create(); // this could also take arguments like x, y, and parent
}
private static final Map<Integer, GameObjectFactory> FACTORIES_BY_ID;
static {
final Map<Integer, GameObjectFactory> factoriesById = new HashMap<>();
// ID 42 is for walls
factoriesById.put(42, new GameObjectFactory() {
@Override
public GameObject create() {
return new Wall();
}
});
//etc.
FACTORIES_BY_ID = factoriesById;
}
如果 ID 是连续的,您还可以使用数组:
private static final GameObjectFactory[] FACTORIES = {
// ID 0 is for walls
new GameObjectFactory() {
@Override
public GameObject create() {
return new Wall();
}
}
};
安enum也可以工作:
enum GameObjectFactory {
WALL(42) {
@Override
GameObject create() {
return new Wall();
}
};
private final int id;
private GameObjectFactory(int id) {
this.id = id;
}
abstract GameObject create();
static GameObjectFactory getById(int id) {
for (GameObjectFactory factory : values()) {
if (factory.id == id) {
return factory;
}
}
throw IllegalArgumentException("Invalid ID: " + id);
}
}
关于java - 如何通过从变量中提取类型来创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17666308/