我将简要介绍一下我的代码结构:
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实现的类的新实例。
//已编辑
在下面,您可以找到可以正常运行的EventPublisher类,但看起来不太好。我想避免if / else或switch的实现,因为它会随着新类的增长而增长。
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实例。
还有一件事。我不能使用AaaEvent的Aaa内包装。它在另一个方向上起作用。我可以在AaaEvent中使用Aaa包中的东西。
您能给我一些技巧来实现这些事情吗?
答案 0 :(得分:3)
public interface EventEmmiter {
Event createEvent();
...
}
public class Aaa implements EventEmitter {
@Override public AaaEvent createEvent() { return new AaaEvent(); }
...
}
public class Bbb implements EventEmitter {
@Override public BbbEvent createEvent() { return new BbbEvent(); }
...
}
现在您可以简单地将其用作:
public void createSomething(EventEmitter eventEmitter) {
Event someEvent = eventEmitter.createEvent();
...
}