Ваш init
метод, кажется, требует способа создания экземпляра из данного класса на основе одного значения String
.
В этомслучай, вам не нужно отражение.Вместо того, чтобы требовать передать Class
для создания экземпляра и инициализации, вы можете реализовать форму «шаблона стратегии», где стратегия является переменной и определяет только то, как создать новый объект, инициализированный ID..
В Java 8 и выше вы можете использовать для этого функциональные интерфейсы и лямбды:
private <T extends AbstractSuperClassA > T init(NamedNodeMap attributes, Function<String,T> creator) {
...
T newElement = creator.apply(identifier);
...
}
, а затем использовать их по своему усмотрению, например
B someB = init(attrs, B::new);
C someC = init(attrs, id -> {C c = new C(); c.setId(id); return c;});
...
.вопрос, однако, как вы решаете, какой конкретный класс должен быть создан.Эта логика должна быть где-то закодирована в любом случае, так что могут быть лучшие подходы соединения логики для сбора значений и инициализации нового экземпляра.
Требуется ли, чтобы экземпляры получали id
в конструкторе?Или их можно настроить позже?