Использование перечисления в переключателе/корпусе
У меня есть объект, обладающий свойством 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;
// ...
}
Что мне делать?
Ответы
Ответ 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:
...
}