gpt4 book ai didi

java - 用多态类替换 switch

转载 作者:行者123 更新时间:2023-11-30 06:05:25 28 4
gpt4 key购买 nike

我使用 switch 语句对存储 Event 类型对象的 PriorityQueue 进行排序。

  private PriorityQueue<Event> events = new PriorityQueue<Event>();

现在,事件可以是两种状态之一:ARRIVALDONE

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代表ARRIVAL2代表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 语句?

最佳答案

事件本身应该包含要在开关内执行的代码,所以基本上

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;
}

去掉了表示到达的 1 和表示完成的 2。如果您的事件在上述更改后不再需要事件类型。

关于java - 用多态类替换 switch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46483943/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com