Использование перечисления в переключателе/​​корпусе - программирование

Использование перечисления в переключателе/​​корпусе

У меня есть объект, обладающий свойством enum:

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

Что мне делать?

4b9b3361

Ответ 1

Вы можете указать статический метод в перечислении:

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.

Ответ 2

Каждое перечисление Java имеет порядковый номер, который автоматически присваивается, поэтому вам не нужно вручную указывать int (но имейте в виду, что ординалы начинаются с 0, а не 1).

Затем, чтобы получить перечисление из порядкового номера, вы можете сделать:

int downloadStatus = ...
DownloadStatus ds = DownloadStatus.values()[downloadStatus];

... тогда вы можете сделать свой переключатель, используя перечисление...

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