带有 Class<?> 参数的 ObjectFactory
ObjectFactory with Class<?> argument
我正在开发一个可以使用 Class 参数实例化 Ability 类型对象的工厂。这个工厂的代码是:
public static final class AbilityFactory {
private AbilityFactory(){}
public static <T extends Class<A>, A extends Ability> A getAbility(T clazz){
A ability = null;
try{
ability = clazz.newInstance();
} catch(InstantiationException | IllegalAccessException ex){
ex.printStackTrace();
}
return ability;
}
}
客户端代码是这样的:
Ability.AbilityFactory.getAbility(Firebolt.class));
我认为这个设计的唯一问题是能力 class 是 抽象的 你可以传递这样的东西:
Ability.AbilityFactory.getAbility(Ability.class));
这导致 java.lang.InstantiationException。
我想知道我是否可以做一些限制,比如“?扩展能力而不是能力”,或者这只是一个糟糕的设计,我应该将枚举作为参数传递到工厂方法中以防止这种情况发生。
你唯一能做的就是提供一个标记界面,比方说 ConcreteAbility
并有 <T extends Ability & ConcreteAbility>
。然后你需要实现具有所有具体能力的 ConcreteAbility。
我正在开发一个可以使用 Class 参数实例化 Ability 类型对象的工厂。这个工厂的代码是:
public static final class AbilityFactory {
private AbilityFactory(){}
public static <T extends Class<A>, A extends Ability> A getAbility(T clazz){
A ability = null;
try{
ability = clazz.newInstance();
} catch(InstantiationException | IllegalAccessException ex){
ex.printStackTrace();
}
return ability;
}
}
客户端代码是这样的:
Ability.AbilityFactory.getAbility(Firebolt.class));
我认为这个设计的唯一问题是能力 class 是 抽象的 你可以传递这样的东西:
Ability.AbilityFactory.getAbility(Ability.class));
这导致 java.lang.InstantiationException。
我想知道我是否可以做一些限制,比如“?扩展能力而不是能力”,或者这只是一个糟糕的设计,我应该将枚举作为参数传递到工厂方法中以防止这种情况发生。
你唯一能做的就是提供一个标记界面,比方说 ConcreteAbility
并有 <T extends Ability & ConcreteAbility>
。然后你需要实现具有所有具体能力的 ConcreteAbility。