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í (
if
neboswitch
). 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
int
a 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.