java - 如何使用枚举作为标识符创建类的不同实例?

标签 java

您好,我的游戏项目遇到问题,因为我需要“扩展”类,这些类的功能略有不同,并且创建仅具有不同名称的实体实例将无法正常工作,因为某些类已扩展。

基本上我有一个实体类,其中不同的实体扩展和实现不同的类,但我想学习仅通过使用枚举来创建每个类的实例的最佳方法。例如:new Entity(Enum.ZOMBIE) 或 new Entity(Enum.SPIDER)

我这样做是因为我的生成器被设计为根据用户输入生成不同类型的生物,如果我使用 else if 或 switch 方法,它将变得非常非常长。

您将如何解决这个问题?也许我的主类中有一个 switch/case 并返回修改后的类的实例?

抱歉,如果这没有意义,我无法解释它应该如何工作。

谢谢。

最佳答案

您需要一个查找表来存储类的名称以及创建该类的实例的方法。

假设您有一个 Entity 类和几个扩展它的类:ZombieSpiderHero。您定义一个创建实体的接口(interface):

@FunctionalInterface
interface EntityFactory {
    Entity create();
}

还有一个“表”来存储从名称到此接口(interface)的实例的映射:

Map<String, EntityFactory> factories = new HashMap<>();

然后注册你的子类工厂:

factories.put("Zombie", Zombie::new);
factories.put("Spider", Spider::new);
factories.put("Hero", Hero::new);

还有一个执行查找并调用适当工厂的 util 方法:

Entity create(String name) {
    EntityFactory factory = factories.get(name);
    if (factory == null) {
        throw new NoSuchElementException();
    }
    return factory.create();
}

现在,只要注册所有实体类,您就可以根据用户输入创建实体:

Entity spider0 = create("Spider");
Entity hero0 = create("Hero");

关于java - 如何使用枚举作为标识符创建类的不同实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40669323/

相关文章:

java - 创建 2 个数组 - 第一个有随机整数,第二个有唯一的随机整数

java - 如何使用 Jackson 序列化对象并向其添加动态字段

java - 如何在方法之间正确传递数组

java - 插入期间数据库删除失败

java - 使用 CDI 的简单 Faces Flow 中的 ContextNotActiveException

java - 为什么 kafka 流线程会在源主题分区更改时死亡?谁能指出这方面的阅读 Material ?

java - 休息 jax-rs : server error

java - 在 Spring REST Controller 中将 JSON 映射到 Hibernate 模型

Java 编译器忽略类型安全

java - 使用 Java 反序列化 XML 并获取值