Java 在switch/case中使用enum

Java 在switch/case中使用enum,java,Java,我有一个具有枚举属性的实体: // MyFile.java public class MyFile { private DownloadStatus downloadStatus; // other properties, setters and getters } // DownloadStatus.java public enum DownloadStatus { NOT_DOWNLOADED(1), DOWNLOAD_IN_PROGRESS(2),

我有一个具有枚举属性的实体:

// MyFile.java
public class MyFile {   
    private DownloadStatus downloadStatus;
    // other properties, setters and getters
}

// DownloadStatus.java
public enum DownloadStatus {
    NOT_DOWNLOADED(1),
    DOWNLOAD_IN_PROGRESS(2),
    DOWNLOADED(3);

    private int value;
    private DownloadStatus(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
} 
我想将此实体保存在数据库中并检索它。问题是我将int值保存在数据库中,然后得到int值!我不能使用如下开关:

MyFile file = new MyFile();
int downloadStatus = ...
switch(downloadStatus) {
    case NOT_DOWNLOADED:
    file.setDownloadStatus(NOT_DOWNLOADED);
    break;
    // ...
}    

我该怎么办?

每个Java枚举都有一个自动分配的序号,因此您不需要手动指定int(但请注意序号从0开始,而不是从1开始)

然后,要从序号中获取枚举,可以执行以下操作:

int downloadStatus = ...
DownloadStatus ds = DownloadStatus.values()[downloadStatus];
。。。然后您可以使用枚举进行切换

switch (ds)
{
  case NOT_DOWNLOADED:
  ...
}

您可以在枚举中提供静态方法:

public static DownloadStatus getStatusFromInt(int status) {
    //here return the appropriate enum constant
}
然后在主代码中:

int downloadStatus = ...;
DowloadStatus status = DowloadStatus.getStatusFromInt(downloadStatus);
switch (status) {
    case DowloadStatus.NOT_DOWNLOADED:
       //etc.
}
与序数方法相比,这种方法的优点是,如果枚举更改为以下内容,它仍然可以工作:

public enum DownloadStatus {
    NOT_DOWNLOADED(1),
    DOWNLOAD_IN_PROGRESS(2),
    DOWNLOADED(4);           /// Ooops, database changed, it is not 3 any more
}

请注意,
getStatusFromInt
的初始实现可能使用ordinal属性,但实现细节现在包含在enum类中。

可能是最坏的情况,但唯一的解决方案是通过扩展类使用不同的getter,该类将值返回为enum。“..,因此您不需要手动指定整数…”。。。“@user504342:这个答案的要点是一个枚举已经包含序号,因此如果您的用例允许您依赖它,您可以不需要做更多的事情。如果你不能使用序数,因为你必须符合一些现有的方案,那么就涵盖这一点。\@GregKopff:很抱歉不同意。根据Joshua Bloch的《有效Java》(第二版)一书,您不应该依赖序数值。请参阅第31项,该项明确指出:“永远不要从其序号派生与枚举关联的值;而是将其存储在实例字段中”。这本书详细解释了原因。