作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我有一个标准枚举(在本例中是建筑物列表的表示),如下所示:
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/
我是一名优秀的程序员,十分优秀!