Я разрабатываю фабрику, которая может создавать объекты типа 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 в качестве аргумента в заводский метод для предотвращения этой ситуации.
Единственное, что вы могли бы сделать, это предоставить интерфейс маркера, допустим, ConcreteAbility
и <T extends Ability & ConcreteAbility>
. Затем вам нужно реализовать ConcreteAbility со всеми конкретными возможностями.
Ability
имеют конструктор по умолчанию, и вам нужен объектClass
чтобы создать его экземпляр с помощью этой фабрики, тогда какой смысл? Почему бы просто не использовать новый оператор и избегать рефлексии?