我的班级是这样的:
class X {}
class Y extends X {};
class Z extends X {};
我有每个子类(id + class)的枚举:
enum Type {
Y_TYPE(1, Y.class), Z_TYPE(2, Z.class);
int id;
Class c;
public Type(int id, Class c) { this.id = id; this.c = c; }
public static X createInstance() throws Exception {
return c.newInstance();
}
}
然后我按如下方式使用它们:
X parseFromID(int id) {
for (Type v : Type.values()) {
if (v.id == id) {
return v.createInstance();
}
}
}
它工作正常,但我想知道这是否是一种基于整数 id 创建数据的 Java 方法?有什么不好的地方需要寻找吗?
有没有办法强制传入 are 的 X 类型的类,而无需冗长的 if-else 条件?想想当我有大量子类时。
为什么要处理整数 id?
我正在编写某种解析器,因此我需要将从某处获取的整数 id 转换为适当的对象。
这里确实没有理由使用反射。抛出异常也是一种不好的做法,如果不使用反射,就不必处理反射异常。你可以简单地做
enum Type {
Y_TYPE(1) {
@Override
public X createInstance() {
return new Y();
}
}, Z_TYPE(2) {
@Override
public X createInstance() {
return new Z();
}
};
private int id;
private Type(int id) {
this.id = id;
}
public abstract X createInstance();
}
这也很有帮助,因为它不会强制每个子类都有一个公共的无参数构造函数,并且如果可能的话,还允许返回 X 或 Y 的相同实例。
如果您担心匿名类定义的冗长性,则可以将它们替换为 lambda(如果您使用的是 Java 8):
import java.util.function.Supplier;
enum Type {
Y_TYPE(1, X::new), Z_TYPE(2, Y::new);
private int id;
private Supplier<X> supplier;
private Type(int id, Supplier<X> supplier) {
this.id = id;
this.supplier = supplier;
}
public X createInstance() {
return supplier.get();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)