Java Enum

Wstęp

Zajmiemy się teraz Java Enum, jest to typ danych wyliczeniowy. Można go porównać do stałych, czyli do takich zmiennych, które nigdy nie zmieniają swojej wartości. Jednak Enum ma więcej zalet. Grupuje te stałe w gotowe bloki. Pozwala szybko zrozumieć, co oznacza dana wartość.

public enum Status {
    CREATE, EMPLOYEE, CLIENT, ARCHIVE
}

Rozpatrzmy taką sytuację. Stworzyliśmy sobie cztery statusy. Pierwszy jest tworzony, gdy klient tworzy sprawę. Następnie sprawa jest przypisywana do pracownika, zmieniamy status na EMPLOYEE. Pracownik odpowiada klientowi, sprawa jest przepisywana dla CLIENT i tak w kółko aż do zakończenia rozmowy, gdy sprawa trafia na status ARCHIVE.

Czytelny kod przy wykorzystaniu Java Enum

Co daje nam takie rozwiązanie, przede wszystkim czytelność w kodzie. Załóżmy, że chcemy zapisać komentarz, który dostaliśmy od klienta i zmienić status na EMPLOYEE.

int result = documentDAO.upgradeStatus(document.getId(), Status.EMPLOYEE.id());
int result = documentDAO.upgradeStatus(document.getId(), 2);

Jeżeli porównamy te dwie linijki kodu, to stwierdzimy, że są one zupełnie inne. Jednak są one sobie równoznaczne. Jednocześnie można zauważyć, że w przypadku pierwszego zapisu od razu wiemy, jaki jest status. W drugim przypadku musimy sięgnąć do bazy danych, aby sprawdzić, co oznacza identyfikator 2. To już dużo więcej pracy.

Teraz jednak nasz status nie zadziała, bo nie zawiera metody Id, która zdefiniujemy teraz.

public enum Status {
    CREATE, EMPLOYEE, CLIENT, ARCHIVE;

    public int getId() {
        return this.ordinal()+1;
    }
}

Operowanie na Stringach

Możemy jednak nie wykorzystywać Enum w sposób przedstawiony powyżej. Gdy potrzebujemy porównać wartość otrzymaną w formie tekstowej z wartością Enum. Porównywanie wartości w Enum może się odbywać na dwa sposoby:

Pierwszy z nich to przekształcenia Enum na string i dopiero wtedy porównujemy wartości.

        Status status = Status.ARCHIVE;
        String archive = status.name();
        String arch = "ARCHIVE";
        if(archive.equals(arch)) {
            System.out.println("tak");
        } else {
            System.out.println("nie");
        }

Drugą zaś przekształcenie String na Enum i porównanie obydwu elementów

        Status status = Status.ARCHIVE;
        Status archive = Status.valueOf("ARCHIVE");
        if(status==archive) {
            System.out.println("tak");
        } else {
            System.out.println("nie");
        }

W tym jednak przypadku możemy się spotkać z problemem poprawności wprowadzanych danych. Co, gdy utworzymy taki kod:

        Status status = Status.ARCHIVE;
        Status archive = Status.valueOf("Archive");
        if(status==archive) {
            System.out.println("tak");
        } else {
            System.out.println("nie");
        }

Oczywiście otrzymujemy wyjątek. Jest to spowodowane faktem, że dla Javy Archive nie równa się ARCHIVE.

Exception in thread "main" java.lang.IllegalArgumentException: No enum constant Status.Archive
	at java.lang.Enum.valueOf(Enum.java:238)
	at pl.grzegorzkossa.weight.Status.valueOf(Status.java:3)
	at pl.grzegorzkossa.weight.Document.main(Document.java:20)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Przeczytaj pozostałe artykuły z serii Java