Kiedy warto używać enum w Java?

0

Kiedy warto użyć typu enum w Java?

W języku C jest to łatwiejsze do wyczucia, ponieważ nie ma tu klas. Wtedy osoba jest raczej skazana na switch. Moim powodem do używania enum było tylko to, żeby kompilator ubezpieczał mnie (wtedy zamiast intów mogłem sobie wyselekcjonować kilka wartości i na nich się opierać)

W Javie typ enum jest dla mnie wieloznaczny. Trochę mi przypomina to enum z C, a trochę niepełnosprawną klasę. Enum z C coraz mniej wydaje się użyteczny w Java, bo przecież lepiej jest unikać switchów, natomiast iść w kierunku niekompletnej klasy to też wydaje mi się dziwne..

5

Naprzykład tam gdzie chcesz ograniczyć liczbę stanów dla obiektów. Przykład płeć. Lepiej wygląda:

public enum Sex{
    M, F
}

niż

public class Sex {

     private Sex(){}

     public static final Sex m = new Sex();
     public static final Sex f = new Sex();
//...
}

albo jeszcze ciekawsza wersja, którą możesz spotkać w starym kodzie

public class Sex {

     private Sex(){}

     public static final int m = 0;
     public static final int f = 1;

}

Innym przykładem może być bardzo specyficzna implementacja singletonu:

public enum Singleton{
     INSTANCE

     // metody, stan itp.
}

Kolejna sprawa to switch, ale taki bardziej "na wypasie", bo powiązany ze wzorcem strategii.

enum Visibility{
    
    Visible {
        @Override
        void render(Element e, Document d) {
            document.attach(e);
        }
    }, Unvisible {
        @Override
        void render(Element e, Document d) {
            // do nothing
        }
    };
    
    abstract void render(Element e, Document d);
    
}

// i dalej w kodzie 
    
public void rendering(Doocument d){
    this.visibility.render(this, d);
}

Do tego oczywiście wszlekiej maści flagi i markery dla których zwykły boolean nie wystarcza.

  • edit: nawet mamy coś na ten temat w kompendium....* Enum
0

Jeżeli z góry znasz liczbę obiektów danego typu i chcesz zabezpieczyć kod przed tworzeniem nowych, wtedy warto użyć wyliczenia. Samo wyliczenie jest klasą (dziedziczy po Enum) ale obiekty zawarte są również pełnoprawnymi instancjami klasy zdefiniowanej "na miejscu"; używa się na nich konstruktora, mogą mieć własne pola itd. Nie ma w nich nic niepełnosprawnego, tyle tylko, że zmienne te są finalne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1