Výčtový typ
Výčtový typ (v angličtině označovaný jako „enumerated type“ nebo zkráceně „enum“) patří mezi návrhové vzory. Je to datový typ tvořený konečnou omezenou množinou pojmenovaných hodnot. Každý člen výčtového typu je tvořen identifikátorem a hodnotou. Hodnotou zpravidla bývá celočíselná konstanta. „Výčtový typ je zvláštní hodnotový typ s předem určenou sadou číselných hodnot. V základním nastavení jsou tyto číselné hodnoty celá čísla (typ integer), ale mohou být i typu long, byte atd.“ Identifikátor se obvykle v kódu chová jako konstanta. Identifikátory je zvykem psát velkými písmeny a bývají ve většině programovacích jazyků odděleny čárkou.

Použití výčtového typu 
Výčtový typ je určený pro omezenou neměnnou sadu nazývaných hodnot. Hodí se pro výčet názvů dní v týdnu (PONDĚLÍ, ÚTERÝ,… - je jich jen 7), pro jména měsíců (LEDEN, ÚNOR,… - jen 12), pro pojmenování základních barev, pro názvy světových stran, atd. V praxi lze výčtový typ také použít například pro stavy vyhodnocení objednávky (SCHVÁLENO, ZAMÍTNUTO, ZATÍM_NEVYŘÍZENO), pro tvorbu dotazníků se škálovými otázkami, názvy webových prohlížečů (OPERA, CHROME, FIREFOX, IE, SAFARI), hudebních žánrů či kategorií produktů.

Výhody výčtového typu 
Výhodou výčtového typu je mnohem větší přehlednost, čitelnost a srozumitelnost kódu oproti tomu, než když jsou použity celočíselné konstanty. Zlepší se nejen sebe-dokumentace ale i bezpečnost celého kódu. U celočíselných konstant totiž bylo pravděpodobnější riziko, že s nimi budou omylem prováděny matematické operace. Samotné užití výčtového typu se velmi často pojí s konstrukcí switch-case.

Výčtový typ v programovacích jazycích

Výčtový typ v jazyce Java 
V programovacím jazyce Java se výčtový typ objevil ve verzi 5 (interně označované jako 1.5). „Enum dědí od třídy Object a implementuje rozhraní Comparable<E>, Serializable.“ Výčtový typ je deklarován obdobně jako třída, ale místo klíčového slova class je určen pomocí klíčového slova enum, před které se stejně jako u třídy obvykle uvádí klasifikátor přístupu (např. public). Poté následuje výčet identifikátorů, ke kterým jsou přiřazovány ordinální hodnoty. S přiřazováním ordinálních hodnot se, jak je v Javě zvykem, začíná od 0. Prvnímu je přidělena 0 a na pořadí identifikátorů ve výčtu tedy záleží. Pokud je potřeba hodnotu nastavit manuálně, napíše se do jednoduchých závorek () a je nutné nadefinovat konstruktor. Jako hodnotu lze výčtovému typu v Javě oproti jiným programovacím jazykům nastavit také libovolný datový typ, lambda výraz nebo celou třídu.

Ukázka jednoduchého výčtového typu:

public enum Mesic
{
     NEURCENY, LEDEN, UNOR, BREZEN, DUBEN, KVETEN, CERVEN,
     CERVENEC, SRPEN, ZARI, RIJEN, LISTOPAD, PROSINEC

}

Příklad složitějšího výčtového typu s dvouparametrickým
konstruktorem pro číslo a jméno měsíce:

public enum Mesic
{
     NEURCENY(0,"Neurčený"),
     LEDEN(1,"Leden"),
     UNOR(2,"Únor"),
     BREZEN(3,"Březen"),
     DUBEN(4,"Duben"),
     KVETEN(5,"Květen"),
     CERVEN(6,"Červen"),
     CERVENEC(7,"Červenec"),
     SRPEN(8,"Srpen"),
     ZARI(9,"Září"),
     RIJEN(10,"Říjen"),
     LISTOPAD(11,"Listopad"),
     PROSINEC(12,"Prosinec");

     private final String jmeno;
     private final int cislo;

     private Mesic(int cislo, String jmeno)
     {
          this.cislo=cislo;
          this.jmeno=jmeno;
     }
}

Mesic vybrany=Mesic.SRPEN;

Výčtový typ v jazyce C# 
Výčtový typ v C# je uvozen
klíčovým slovem enum. Před klíčovým
slovem enum může být klasifikátor přístupu. Při přiřazování ordinálních hodnot se defaultně začíná od nuly. Avšak v určitých situacích, například při číslování měsíců v roce máme zažito, že leden je první nikoli nultý měsíc, je potřeba počítat od 1. Toho je možné docílit přidělením jedničky prvnímu identifikátoru. V C# se hodnoty identifikátorům udělují s operátorem =.

Ukázka jednoduchého výčtového typu s počítáním od 1 nikoli od 0:

public enum Mesic
{
     Leden=1, Unor, Brezen, Duben, Kveten, Cerven, Cervenec, Srpen, Zari, Rijen, Listopad, Prosinec
}

Mesic vybrany=Mesic.Srpen;

Výčtový typ v jazyce C/C++ 
V C nebo v C++ je výčtový typ definován pomocí klíčového slova enum. „Deklarace typu enum má hodně společného s deklarací struktury. Lze vytvořit buďto jen výčtový typ enum (stejně jako jenom strukturu), nebo pomocí typedef definovat nový datový typ.“ Implicitně se zde identifikátorům přiřazuje hodnota od 0. Vlastní hodnoty je možné přidělit přes operátor =. Název proměnné při deklaraci výčtového typu s použitím typedef se uvádí až na konci.

Ukázka výčtového typu jako nového datového typu:

typedef enum
{
     LEDEN=1,
     UNOR=2,
     BREZEN=3,
     DUBEN=4,
     KVETEN=5,
     CERVEN=6,
     CERVENEC=7,
     SRPEN=8,
     ZARI=9,
     RIJEN=10,
     LISTOPAD=11,
     PROSINEC=12
} MESIC;

Výčtový typ v jazyce Javascript 
Definice výčtového typu v dynamickém programovacím jazyce Javascriptu je dosažena vytvořením nového objektu. Nejrychlejší cestou je založení proměnné a zavolání konstruktoru objektu {}, kde atributy jsou identifikátory výčtu a od hodnot jsou oddělené dvojtečkou. Stejného výsledku, avšak poměrně zdlouhavěji, se lze dopracovat s konstruktorem objektu new Object() nebo novou funkcí function MyEnum(){}. Další možností je také využití prototype.

Příklad výčtového typu s použitím konstruktoru {}:

var Mesic = {
     LEDEN: 1,
     UNOR: 2,
     BREZEN: 3,
     DUBEN: 4,
     KVETEN: 5,
     CERVEN: 6,
     CERVENEC: 7,
     SRPEN: 8,
     ZARI: 9,
     RIJEN: 10,
     LISTOPAD: 11,
     PROSINEC: 12
}

var vybrany = Mesic.SRPEN;

Výčtový typ v jazyce Pascal 
V jazyce Pascalu je výčtový typ určen klíčovým slovem type ještě před deklarací proměnných programu. Je omezen na maximálně „256“ hodnot. Číselná hodnota se začíná přidělovat od nuly.

Příklad syntaxe výčtového typu v Pascalu:

type TMesic = (NEURCENY, LEDEN, UNOR, BREZEN, DUBEN, KVETEN, CERVEN, CERVENEC, SRPEN, ZARI, RIJEN, LISTOPAD, PROSINEC);
var mesic : TMesic;

Výčtový typ v jazyce Python 
Výčtový typ je v jazyce Python podporován od verze „3.4“. Před jeho deklarací jako nové třídy, která dědí od Enum je potřeba provést import. Hodnoty se přiřazují pomocí =.

from enum import Enum
class Mesic(Enum):
     leden = 1
     unor = 2
     brezen = 3
     duben = 4
     kveten = 5
     cerven = 6
     cervenec = 7
     srpen = 8
     zari = 9
     rijen =10
     listopad =11
     prosinec = 12

Výčtový typ v jazyce Visual Basic 
Pro výčtový typ ve Visual Basic se používá klíčové slovo enum. Implicitně jsou mu hodnoty
přidělovány od 0, explicitně je lze přidělit s použitím =.

Enum Mesic
     Leden = 1
     Unor = 2
     Brezen = 3
     Duben = 4
     Kveten = 5
     Cerven = 6
     Cervenec = 7
     Srpen = 8
     Zari = 9
     Rijen =10
     Listopad =11
     Prosinec = 12
End Enum

Výčtový typ v jazyce PHP 
Pro výčtový typ v jazyce PHP se používá klíčové slovo enum. Výčtový typ lze pak uvádět jako parametry funkcí a metod.

enum Mesic
{
    case Leden;
    case Unor;
    case Brezen;
    case Duben;
    case Kveten;
    case Cerven;
    case Cervenec;
    case Srpen;
    case Zari;
    case Rijen;
    case Listopad;
    case Prosinec;
}

Výčtový typ v datových strukturách 
Výčtový typ lze také použít v datových strukturách a
databázích. V MySQL databázi je prvnímu řetězci přiřazena 1. Nula je
přidělena chybovému prázdnému řetězci.

Ukázka vytváření tabulky MySQL s výčtem:

CREATE TABLE ukazka (
     mesic ENUM('Leden', 'Unor', 'Brezen', 'Duben', 'Kveten', 'Cerven', 'Cerven','Cervenec', 'Srpen', 'Zari', 'Rijen', 'Listopad', 'Prosinec')
);

V XML schématu je možné definici výčtového typu
postavit na restrikci, která omezí povolené hodnoty pouze na ty uvedené ve
výčtu.

Příklad výčtového typu v XML schématu:

<xs:simpleType name="Mesic">
     <xs:restriction base="xs:string">
          <xs:enumeration value="Leden"/>
          <xs:enumeration value="Unor"/>
          <xs:enumeration value="Brezen"/>
          <xs:enumeration value="Duben"/>
          <xs:enumeration value="Kveten"/>
          <xs:enumeration value="Cerven"/>
          <xs:enumeration value="Cervenec"/>
          <xs:enumeration value="Srpen"/>
          <xs:enumeration value="Zari"/>
          <xs:enumeration value="Rijen"/>
          <xs:enumeration value="Listopad"/>
          <xs:enumeration value="Prosinec"/>
     </xs:restriction>
</xs:simpleType>

Odkazy

Citace

Reference 
 PYTHON SOFTWARE FOUNDATION: 8.13. enum – Support for enumerations [online]. Python 3.4.2 Documentation, 29.10.2014. Dostupné z WWW: <https://docs.python.org/3.4/library/enum.html>
 ORACLE CORPORATION: Enum [online]. The Java Tutorials. Dostupné z WWW: <https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html>
 ORACLE CORPORATION: Class Enum<E extends Enum<E>> [online]. Java Platform Standard Edition 7 Documentation, 26.9.2014. Dostupné z WWW: <https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html>
 MICROSOFT DEVELOPER NETWORK: Výčtové typy (Průvodce programováním v C#) [online]. Visual C#, 14.11.2014. Dostupné z WWW: <http://msdn.microsoft.com/cs-cz/library/cc138362.aspx>
 ORACLE CORPORATION: 11.4.4 The ENUM Type [online]. MySQL 5.0 Reference Manual. Dostupné z WWW: <http://dev.mysql.com/doc/refman/5.0/en/enum.html>
 W3SCHOOLS.COM: XSD Restrictions/Facets [online]. XML Schema Tutorial. Dostupné z WWW: <https://web.archive.org/web/20150118180516/http://www.w3schools.com/schema/schema_facets.asp>
 KOSEK, Jiří: Kapitola 3. XML schémata [online]. XML schémata, 10.11.2014. Dostupné z WWW: <http://www.kosek.cz/xml/schema/wxs.html>

Související články 
 Case a switch konstrukce

Externí odkazy 
 http://www.algoritmy.net/article/30320/Enum-19
 http://javahowto.blogspot.cz/2008/04/java-enum-examples.html
 http://crunchify.com/why-and-for-what-should-i-use-enum-java-enum-examples/
 http://stackoverflow.com/questions/17741721/getting-string-value-from-enum-in-java
 http://stackoverflow.com/questions/3501966/enums-with-string-values-and-finding-enum-by-value
 http://www.dredwerkz.cz/java_features/JF_Enums.html
 http://www.zdrojak.cz/clanky/datovy-typ-enum-v-php/
 http://www.java.cz/article/1292 
 http://physics.ujep.cz/~mmaly/vyuka/oporaPrgB/034.html
 https://web.archive.org/web/20150213212750/http://www.linuxsoft.cz/article.php?id_article=1057

Návrhové vzory
Programování