ObjectFactory с аргументом класса<?>
Я разрабатываю фабрику, которая может создавать экземпляры объектов типа Ability с помощью параметра Class. Код для этой фабрики:
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));
Единственная проблема, которую я понял в этом дизайне, заключается в том, что класс Ability является абстрактным, и вы можете передать что-то вроде этого:
Ability.AbilityFactory.getAbility(Ability.class));
что приводит к исключению java.lang.InstantiationException.
Я хотел знать, могу ли я установить некоторые ограничения, такие как "? Расширяет Способность, но не Способность", или это просто плохой дизайн, и я должен передать, например, Enum в качестве аргумента в метод фабрики, чтобы предотвратить эту ситуацию.
1 ответ
Единственное, что вы можете сделать, это предоставить интерфейс маркера, скажем, ConcreteAbility
и имеют <T extends Ability & ConcreteAbility>
, Затем вам нужно реализовать ConcreteAbility со всеми конкретными возможностями.