2013-01-04 24 views
14

Mam podmiot, który ma właściwość ENUM:użyciu enum switch/case

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

Chcę zapisać ten podmiot w bazie danych i pobrać go. Problem polega na tym, że zapisuję wartość int w bazie danych i otrzymuję wartość int! Nie mogę użyć przełącznika jak poniżej:

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

Co mam zrobić?

+0

może to być najgorszy przypadek, ale tylko rozwiązanie, które mogę se, użyć innego gettera przez rozszerzenie klasy, która zwraca wartość jako wyliczenie. –

Odpowiedz

26

Można przewidywać statyczna metoda w eNUM:

public static DownloadStatus getStatusFromInt(int status) { 
    //here return the appropriate enum constant 
} 

Następnie w głównym kodzie:

int downloadStatus = ...; 
DowloadStatus status = DowloadStatus.getStatusFromInt(downloadStatus); 
switch (status) { 
    case DowloadStatus.NOT_DOWNLOADED: 
     //etc. 
} 

Zaletą tego kontra porządkowej podejścia jest to, że będzie on nadal działać, jeśli wprowadzone zmiany enum coś jak:

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

nocie, że początkowa realizacja getStatusFromInt może użyć właściwości porządkowej, ale ten szczegół implementacji jest teraz zamknięty w klasie enum.

11

Każde wyliczenie Java ma porządek, który jest automatycznie przypisywany, więc nie musisz ręcznie określać int (ale pamiętaj, że numery porządkowe zaczynają się od 0, a nie od 1).

Następnie, aby uzyskać enum z porządkowej, można zrobić:

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

... wtedy można zrobić za pomocą przełącznika enum ...

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

"..., więc nie musisz ręcznie określać int ..." <--- Nie jest to prawdą, gdy musisz komunikować się z innym oprogramowaniem (zewnętrznym) lub maszynami, które mają stałe liczby całkowite dla pewnych interfejs (np. typ wiadomości)! – user504342

+0

@ user504342: Punktem tej odpowiedzi jest to, że enum zawiera już porządek, a więc _ jeśli twój przypadek użycia pozwala ci na to polegać, możesz bez konieczności robienia czegokolwiek więcej. Jeśli nie możesz użyć polecenia porządkowego, ponieważ musisz dostosować się do istniejącego schematu, to [assylias 'answer] (http://stackoverflow.com/a/14154869/1212960) obejmuje to. –

+0

\ @GregKopff: przepraszam, że się nie zgadzam. Według książki Joshua Blocha Effective Java (wydanie drugie) NIE powinieneś polegać na wartościach porządkowych. Patrz pozycja 31, która jasno stwierdza: "Nigdy nie wyprowadzaj wartości związanej z wyliczeniem z jej liczby porządkowej, zamiast tego przechowuj ją w polu instancji". Książka wyjaśnia szczegółowo, dlaczego tak jest. – user504342