如何通过类类型委托构造函数的实例化?
How to delegate instantiation of constructor by classtype?
我有几个 class 扩展 BaseClass
。现在我想在一个DelegatorContext
中静态定义一个activeclass,并且每个对象的创建都应该基于active上下文
示例:
class BaseClass {
String firstname, lastname;
}
class FirstClas extends BaseClass {}
class SndClass extends BaseClass {}
class DelegatorContext {
public static BaseClass activeClass;
}
class Delegator {
BaseClass create(String firstname, String lastname) {
return DelegatorContext.activeClass instanceof FirstClass
? new FirstClass(firstname, lastname) : new SndClass(firstname, lastname);
}
}
如果引入更多实体扩展 BaseClass
,该示例将获得更多样板文件 BaseClass
。
有没有更好的模式来解决我的问题?甚至 Java8 和 Functions
?还是泛型?
我使用这个结构是为了能够在运行时切换实现...
您可以使用作为 BaseClass
子类的类型参数使 DelegatorContext
成为泛型。
此外,activeClass
不应该是 static
并且应该引入一个额外的 Class<T>
成员来保存关于 activeClass
的 Class
信息。
它将用于实例化正确的子类:
class DelegatorContext<T extends BaseClass> {
private Class<T> clazz;
public T activeClass;
private DelegatorContext(Class<T> clazz) {
this.clazz = clazz;
}
public T createInstance(String firstname, String secondname) {
activeClass = clazz.newInstance();
activeClass.setFirstName(firstname);
activeClass.setSecondName(secondname);
return activeClass;
}
public static <T extends BaseClass> DelegatorContext<T> of(Class<T> clazz) {
return new DelegatorContext<T>(clazz);
}
}
有了这个,你可以做:
<T extends BaseClass> T create(Class<T> clazz, String firstname, String lastname) {
return DelegatorContext.of(clazz).createInstance(firstname, lastname);
}
据我所知,您最好在此处使用枚举:
enum DelegatorContext {
First {
@Override
BaseClass instantiate(String firstName, String lastName) {
return new FirstClass(firstName, lastName);
}
},
Second{
@Override
BaseClass instantiate(String firstName, String lastName) {
return new SecondClass(firstName, lastName);
}
};
static Context defaultContext;
abstract BaseClass instantiate(String firstName, String lastName);
}
我猜,你的意思是这样的:
interface BaseClassFactory {
BaseClass create(String firstname, String lastname);
}
class DelegatorContext {
public static BaseClassFactory active;
}
…
DelegatorContext.active=FirstClass::new;
…
DelegatorContext.active=SndClass::new;
这就要求所有的subclass都有一个签名相同的构造函数,匹配工厂接口的签名(有趣的给举个例子)
你真的不需要另一个工厂 class 但为了完整起见,它将是:
class Delegator {
BaseClass create(String firstname, String lastname) {
return DelegatorContext.active.create(firstname, lastname);
}
}
我有几个 class 扩展 BaseClass
。现在我想在一个DelegatorContext
中静态定义一个activeclass,并且每个对象的创建都应该基于active上下文
示例:
class BaseClass {
String firstname, lastname;
}
class FirstClas extends BaseClass {}
class SndClass extends BaseClass {}
class DelegatorContext {
public static BaseClass activeClass;
}
class Delegator {
BaseClass create(String firstname, String lastname) {
return DelegatorContext.activeClass instanceof FirstClass
? new FirstClass(firstname, lastname) : new SndClass(firstname, lastname);
}
}
如果引入更多实体扩展 BaseClass
,该示例将获得更多样板文件 BaseClass
。
有没有更好的模式来解决我的问题?甚至 Java8 和 Functions
?还是泛型?
我使用这个结构是为了能够在运行时切换实现...
您可以使用作为 BaseClass
子类的类型参数使 DelegatorContext
成为泛型。
此外,activeClass
不应该是 static
并且应该引入一个额外的 Class<T>
成员来保存关于 activeClass
的 Class
信息。
它将用于实例化正确的子类:
class DelegatorContext<T extends BaseClass> {
private Class<T> clazz;
public T activeClass;
private DelegatorContext(Class<T> clazz) {
this.clazz = clazz;
}
public T createInstance(String firstname, String secondname) {
activeClass = clazz.newInstance();
activeClass.setFirstName(firstname);
activeClass.setSecondName(secondname);
return activeClass;
}
public static <T extends BaseClass> DelegatorContext<T> of(Class<T> clazz) {
return new DelegatorContext<T>(clazz);
}
}
有了这个,你可以做:
<T extends BaseClass> T create(Class<T> clazz, String firstname, String lastname) {
return DelegatorContext.of(clazz).createInstance(firstname, lastname);
}
据我所知,您最好在此处使用枚举:
enum DelegatorContext {
First {
@Override
BaseClass instantiate(String firstName, String lastName) {
return new FirstClass(firstName, lastName);
}
},
Second{
@Override
BaseClass instantiate(String firstName, String lastName) {
return new SecondClass(firstName, lastName);
}
};
static Context defaultContext;
abstract BaseClass instantiate(String firstName, String lastName);
}
我猜,你的意思是这样的:
interface BaseClassFactory {
BaseClass create(String firstname, String lastname);
}
class DelegatorContext {
public static BaseClassFactory active;
}
…
DelegatorContext.active=FirstClass::new;
…
DelegatorContext.active=SndClass::new;
这就要求所有的subclass都有一个签名相同的构造函数,匹配工厂接口的签名(有趣的给
你真的不需要另一个工厂 class 但为了完整起见,它将是:
class Delegator {
BaseClass create(String firstname, String lastname) {
return DelegatorContext.active.create(firstname, lastname);
}
}