Java: Enum
Z MiS
Obsah |
K čemu je?
- Výčtový typ slouží zejména v situacích, kdy některý datový typ může nabývat jenom malý počet předem známých hodnot.
- Příklady využití výčtového typu
- Dny v týdnu
- Pohlaví
- Typy platby (zde zvážíme, zda radši nepoužít samostatnou třídu s podtřídami)
Deklarace výčtového typu
- Výčtový typ v Javě se vytváří podobně jako třída.
public enum Pohlavi {
Muz, Zena, Neuvedeno
}
Vytvoření proměnné
Pohlavi pohlavi = Pohlavi.Muz;
Použití výčtového typu
switch (pohlavi) {
case Pohlavi.Muz:
...
break;
case Pohlavi.Zena:
...
break;
case Pohlavi.Neuvedeno:
...
break;
}
if (pohlavi == Pohlavi.Muz) {...}
Šlo by situaci řešit jinak?
Samostatná třída
- Jinou variantou řešení by bylo založit samostatnou třídu a vytvořit pevně definovaný počet instancí.
- Toto řešení vyžaduje více psaní a větší zkušenosti s objektovým programováním.
- Toto řešení je vhodnější, pokud se jednotlivé varianty výrazně liší ve svém chování. Umožní nám vytvořit podtřídy, které si implementují vlastní metody.
Složitější deklarace:
public abstract class TypPlatby {
static TypPlatby Hotove = new TypPlatbyHotove();
static TypPlatby NaUcet = new TypPlatbyNaUcet();
private TypPlatby() {} // Aby si nikdo nemohl svévolně vytvářet nové typy platby
public abstract void provedPlatbu();
}
public class TypPlatbyHotove extends TypPlatby {
public void provedPlatbu() {
...
}
}
public class TypPlatbyNaUcet extends TypPlatby {
public void provedPlatbu() {
...
}
}
Obdobné vytvoření proměnné:
TypPlatby typPlatby = TypPlatby.Hotove;
A jednoduché použití:
typPlatby.provedPlatbu();
- Vidíme, že zápis vyžaduje více řádků kódu, ale použití jednotlivých podtříd úplně odstraní nutnost používat větvení (
ifneboswitch). Jednotlivé podtřídy jsou proto mnohem přehlednější a řeší vždy jen jeden konkrétní typ platby. - Použití bude také snadnější. Srovnejte:
Jednoduchoučká deklarace
public enum TypPlatby { Hotove, NaUcet };
Obdobné vytvoření proměnné:
TypPlatby typPlatby = TypPlatby.Hotove;
Ale při každém použití pak velký nepřehledný kód (zvláště pokud bude variant placení více a kód platby delší):
switch (typPlatby) {
case TypPlatby.Hotove:
...
break;
case TypPlatby.NaUcet:
...
break;
};
Náhrada typem int nebo String
- Někoho by možná napadlo použít typ
inta každé hodnotě přiřadit číselnou konstantu. - Tomuto řešení se ale raději vyhneme:
- svádí zavést do kódu konstanty, jejich význam zná pouze autor,
- případné překlepy či špatně zadané hodnoty se nezjistí v době překladu, ale až po spuštění aplikace.