我正在使用Java 1.3进行移动设备开发而没有enum
类型,因此我正在使用Typesafe Enum Pattern。 E.g。
public class DownloadEvent {
//Download events
public static final DownloadEvent DOWNLOAD_STARTED = new DownloadEvent("Download started");
public static final DownloadEvent DOWNLOAD_COMPLETED = new DownloadEvent("Download completed");
private String eventDescription;
private DownloadEvent(String eventDescription){
this.eventDescription = eventDescription;
}
public String toString(){
return eventDescription;
}
}
这种方法的问题是编译器不允许在switch语句中使用类,例如
DownloadEvent event = getDownloadEvent(); //returns a download event
switch(event){
case DownloadEvent.DOWNLOAD_STARTED:
//do some stuff
}
这有什么办法吗?或者我应该回到使用int
常量列表
答案 0 :(得分:3)
您可以为DownloadEvent
提供一个可以使用getter检索的type-property(例如int),并在switch语句中使用该属性
DownloadEvent event = getDownloadEvent(); //returns a download event
switch(event.getType() ){
case DownloadEvent.DOWNLOAD_STARTED.getType():
//do some stuff
}
但这当然不如使用枚举
那么好答案 1 :(得分:2)
您可以在DownloadEvent类中使用静态变量进行计数。然后每个Downloadevent都可以拥有其uniqe id(构造函数中的id = counter++
)。然后你可以做
switch(event.id) {
case DownloadEvent.DOWNLOAD_STARTED.id:
几乎无缝。
答案 2 :(得分:1)
不,那是不可能的。 Java的switch语句只支持原始数据类型,枚举,字符串和一些特殊类(例如Integer)。
一种方法确实是回到使用int列表。另一种方法当然是使用if-then-else而不是switch:
if (DownloadEvent.DOWNLOAD_STARTEd.equals(event)) {}
else if ...
等
答案 3 :(得分:0)
我建议您重构您的实施以使用Strategy pattern,而不是使用switch
,equals
,instanceof
和朋友。它并不难,引入DownLoadEvent
接口并创建两个类:
新界面:
interface DownloadEvent {
void doStuff();
}
头等舱:
public class DownloadStartedEvent implements DownloadEvent {
public void doStuff() {
// does stuff that should happen when the download has started
}
}
第二课:
public class DownloadCompletedEvent implements DownloadEvent {
public void doStuff() {
// does stuff that should happen when the download has completed
}
}
现在替换switch
语句:
DownloadEvent event = getDownloadEvent();
event.doStuff(); // does different stuff depending on the implementing class