java - 如何通过从变量中提取类型来创建对象?

标签 java class types

我一直在用 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/

相关文章:

java - Camel 主体是用请求而不是响应设置的

Typescript - 将泛型类型 'not assignable' 绑定(bind)到扩展类型的函数

mysql - PHP值不会超过127

java类和子类

java - 如何使用 javax.json 读取 JSON 数组

java - 如何从 CPython 调用 java 对象和函数?

php - SWIG fatal error : can not redeclare class

java - 返回类类型并将类类型作为参数

PHP 是命名空间或全局的包含类的一部分吗?

python - 如何知道函数返回类型和参数类型?