我使用switch语句对存储Event类型对象的PriorityQueue进行排序。
private PriorityQueue<Event> events = new PriorityQueue<Event>();
现在,事件可以是两种状态之一,ARRIVAL
或DONE
。
class Event implements Comparable<Event> {
private int eventType;
public Event(int type) {
this.eventType = type;
}
事件就是这样生成的。
Event newArrival = new Event(1) // or 2
this.events.add(newArrival);
整数1
代表ARRIVAL
,2
代表DONE
。
我有以下switch语句,它根据Event对象的事件类型执行某些操作。
//Event is polled out and passed to simulateEvent.
public void simulateEvent(Event e) {
switch (e.getEventType()) {
case 1:
Event e = new Event(2) // If event is "1", queue a new "2", done event.
events.add(e);
...
case 2:
...
default:
System.err.printf("Unknown event type %d\n", e.getEventType());
}
现在我的教授告诉我,我可以使用多态来实现这一目标,即
abstract class Event implements Comparable<Event>{
}
class ArrivalEvent extends Event implements Comparable<Event>{
}
class DoneEvent extends Event implements Comparable<Event>{
}
到目前为止,我见过的所有多态示例都在讨论使用父类创建数组,因此减少了创建单个子对象的需要。
但是,我不确定如何实现我的模拟器可以测试的类似的多态风格事件。考虑到在构造函数中设置了事件类型,我将如何调整我的代码,以便我可以删除switch语句?
答案 0 :(得分:4)
事件本身应该包含要在交换机中执行的代码,所以基本上
public abstract class Event {
public abstract void execute();
}
所以在你的事件处理程序中,你可以简化为
public void simulateEvent(Event e) {
e.execute();
}
并且实现进入这样的具体类:
public class ArrivalEvent implements Event {
public void execute() {
arrivals.add(new DoneEvent());
}
}
作为旁注,我将EventType更改为枚举:
public enum EventType {
ARRIVAL, DONE;
}
为ARRIVAL删除1,为DONE删除2。 如果您在上述更改后事件需要事件类型。
答案 1 :(得分:1)
你可以这样做。
public interface Event extends Comparable<Event>{
void updateEvents(PriorityQueue events);
}
public class ArrivalEvent implements Event{
public void updateEvents(PriorityQueue events) {
events.add(DoneEvent.getInstance());
}
public static Event getInstance() {
return new ArrivalEvent();
}
}
public class DoneEvent implements Event {
public void updateEvents(PriorityQueue events) {
// Whatever is needed
}
public static Event getInstance() {
return new DoneEvent();
}
}
public void simulateEvent(Event e) {
e.updateEvents(events);
}