如何使用 java 反射且不使用开关创建具有父引用的子 class
How to create child class with parant reference with java reflection and without switch
我有一个 class A,它是 classes AB、AC、AD 的父代。另外 class A 有枚举字段“类型”
可以是“A”\“AB”\“AC”\“AD”。
那么,如何用 java 反射替换此开关?
public A f(Type type){
A a;
switch (type){
case A:
a = new A();
break;
case AB:
a = new AB();
break;
case AC:
a = new AC();
break;
case AD:
a = new AD();
break;
}
}
```
显然,您的 switch
语句应该创建给定类型(aa
)的新对象。为了支持这一点,你根本不需要反射。您可以使用,例如
public class A {
public final Supplier<A> factory;
protected A(Supplier<A> factory) {
this.factory = Objects.requireNonNull(factory);
}
public A() {
this(A::new);
}
}
public class AB extends A {
public AB() {
super(AB::new);
}
}
public class AC extends A {
public AC() {
super(AC::new);
}
}
public class AD extends A {
public AD() {
super(AD::new);
}
}
然后,您可以轻松创建一个新对象,例如
A aa = new AB();
A a = aa.factory.get();
// verify our assumption
if(a.getClass() != aa.getClass())
throw new AssertionError();
为了完整性,你可以使用反射,比如
A a = aa.getClass().getConstructor().newInstance();
但是编译器会强制你处理几个潜在的异常,因为有很多可能在运行时出错,而这些在编译时无法检查。
我有一个 class A,它是 classes AB、AC、AD 的父代。另外 class A 有枚举字段“类型” 可以是“A”\“AB”\“AC”\“AD”。 那么,如何用 java 反射替换此开关?
public A f(Type type){
A a;
switch (type){
case A:
a = new A();
break;
case AB:
a = new AB();
break;
case AC:
a = new AC();
break;
case AD:
a = new AD();
break;
}
}
```
显然,您的 switch
语句应该创建给定类型(aa
)的新对象。为了支持这一点,你根本不需要反射。您可以使用,例如
public class A {
public final Supplier<A> factory;
protected A(Supplier<A> factory) {
this.factory = Objects.requireNonNull(factory);
}
public A() {
this(A::new);
}
}
public class AB extends A {
public AB() {
super(AB::new);
}
}
public class AC extends A {
public AC() {
super(AC::new);
}
}
public class AD extends A {
public AD() {
super(AD::new);
}
}
然后,您可以轻松创建一个新对象,例如
A aa = new AB();
A a = aa.factory.get();
// verify our assumption
if(a.getClass() != aa.getClass())
throw new AssertionError();
为了完整性,你可以使用反射,比如
A a = aa.getClass().getConstructor().newInstance();
但是编译器会强制你处理几个潜在的异常,因为有很多可能在运行时出错,而这些在编译时无法检查。