gpt4 book ai didi

java - 从枚举引用创建对象

转载 作者:行者123 更新时间:2023-11-30 04:01:47 25 4
gpt4 key购买 nike

如果我有一个标准枚举(在本例中是建筑物列表的表示),如下所示:

public enum BuildingType {
farm, shop, house
}

以及一个基于“构建”父类(super class)创建对象的函数,例如:

public void addBuilding(BuildingType bType) {
Building b = new Building();
b.start();
}

我的所有子类的名称都与 BuildingType 枚举匹配。有没有一种方法可以使用我的枚举参数来设置对象 b 的类而不需要类语句?

显然是错误的,但类似这样

Building b = new bType(); //using the argument

一如既往地感谢。

最佳答案

您可以定义一个枚举,它也是 factory :

public enum BuildingType {
farm(Farm.class),
shop(Shop.class),
house(House.class);
private Class<? extends Building> clazz;
private BuildingType(Class<? extends Building> clazz) {
this.clazz = clazz;
}

public Building createBuilding() {
try {
return clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(clazz + " has no default constructor");
}
}
}

或者稍微多一些代码,但避免反射,将枚举类设置为 abstract factory并让实例成为工厂:

public enum BuildingType {
farm() {
public Building createBuilding() {
return new Farm();
}
},
shop() {
public Building createBuilding() {
return new Shop();
}
},
house() {
public Building createBuilding() {
return new House();
}
};

public abstract Building createBuilding();
}

无论哪种方式,使用:

public void addBuilding(BuildingType bType) {
Building b = bType.createBuilding();
b.start();
}

关于java - 从枚举引用创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21811665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com