Я кратко опишу, как выглядит моя структура кода:
Класс Aaa реализует EventEmmiter
Класс Bbb реализует EventEmmiter
Событие класса Aaa реализует событие:
public class AaaEvent implements Event {
private final Aaa aaa;
public AaaEvent(Aaa aaa) {
this.aaa = aaa;
}
}
Класс BbbEvent реализует Событие:
public class BbbEvent implements Event {
private final Bbb bbb;
public BbbEvent(Bbb bbb) {
this.bbb = bbb;
}
}
Я хочу создать метод createSomething, чтобы избежать дублирования кода. Я хочу, чтобы этот метод создал, в зависимости от типа аргумента (это может быть Aaa или Bbb), новый экземпляр класса, который реализуется из Event.
// EDITED
Ниже вы можете найти класс EventPublisher, который работает должным образом, но выглядит не очень хорошо. Я хочу избежать, если / else или переключить реализацию, потому что она может расти все больше с новыми классами.
public class EventPublisher {
public void createSomething(EventEmitter eventEmitter) {
DomainEvent event = null;
Class<? extends EventEmitter> eventClass = eventEmitter.getClass();
if (eventClass.isAssignableFrom(Aaa.class)) {
event = new AaaEvents((Aaa) eventEmitter);
} else if (eventClass.isAssignableFrom(Bbb.class)) {
event = new BbbEvents((Bbb) eventEmitter);
} else if () {
some next (eg.CccEvents) class
}
domainEventBus.publish(event);
}
}
Например. Если тип EventEmmiter, переданный в качестве аргумента метода, является Aaa, я хочу создать новый экземпляр AaaEvent.
Еще одна вещь. Я не могу использовать внутреннюю упаковку вещей Aaa от AaaEvent. Это работает в другом направлении. Я могу использовать вещи из пакета Aaa внутри AaaEvent.
Можете ли вы дать мне несколько советов, как реализовать такие вещи?