Výčtový typ v jazyku Java

Od verze javy 5.0 jsou k dispozici výčtové typy, které přináší především zvýšení typové bezpečnosti.
Definice a použití jednoduchého výčtového typu je podobná jako v jazycích C/C++.
Například:

enum Color { RED, GREEN, BLUE }

Color color = Color.BLUE;
//...
switch (color) {
    case BLUE:
        //do something
        break;
    default:
        //do something
}

Na rozdíl od C nebo C++ je enum v javě mnohem mocnější. Výše uvedenou definici si lze představovat jako zkratku za

class Color {
    public static final Color RED   = new Color();
    public static final Color GREEN = new Color();
    public static final Color BLUE  = new Color();

    protected Color() {}
}

Proto je možné definovat uvnitř enumu metody nebo přidávat atributy, což jde vidět v následujícím příkladu.
Je zde uveden výčtový typ plemen psů. U každého plemene chceme mít uvedenou minimální váhu a výšku v kohoutku.
Navíc umí každé plemeno psa štěkat. Protože jediný československý vlčák štěká česky, přepíšeme jeho metodu bark.
Také přepíšeme metodu toString tak, aby se názvy plemen vypisovaly malými písmeny a místo podtržítek byly mezery.

enum DogTribe {
    GERMAN_SHAPHERD_DOG(61, 30),
    GIANT_SCHNAUZER(65, 32),
    CZECHOSLOVAKIAN_WOLFDOG(65, 26) {
        @Override
        public String bark() {
            return "haf-haf";
        }
    };

    public String bark() {
        return "bow-wow";
    }

    public int getDogMinHeight() {
        return this.dogMinHeight;
    }

    public int getDogMinWeight() {
        return this.dogMinWeight;
    }

    @Override
    public String toString() {
        return this.name().toLowerCase().replace('_', ' ');
    }

    private DogTribe(int dogMinHeight, int dogMinWeight) {
        this.dogMinHeight = dogMinHeight;
        this.dogMinWeight = dogMinWeight;
    }

    private int dogMinHeight; //measured in cm in withers
    private int dogMinWeight; //measured in kg
}

public class Main {
    public static void main(String[] args) {
        for (DogTribe tribe: DogTribe.values()) {
            System.out.println(tribe);
            System.out.println("\tMinimal height: " + tribe.getDogMinHeight());
            System.out.println("\tMinimal weight: " + tribe.getDogMinWeight());
            System.out.println("\t" + tribe.bark());
        }
    }
}

No related posts.

Reakce (2) do “Výčtový typ v jazyku Java”

  1. Anonymní napsal:

    Co se týče toho předefinování metody bark() pro hodnotu CZECHOSLOVAKIAN_WOLFDOG, o této možnosti jsem vůbec nevěděl, zajímavé. Něco jsem si o tom vyhledal na Internetu; přesto bych chtěl požádat autora o zdroj, ze kterého čerpal. Já jsem třeba našel stránku [1] (nějaká ofic. dokumentace k Javě 5), přitom třeba v tutoriálu k Javě 6 nic takového není…

    Jinak výčtové typy používám opravdu hodně, občas jich v projektu mám skoro stejně jako („obyčejných“) tříd. :-)

    [1] http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html

  2. Jan Gregor napsal:

    Informace jsem čerpal především z knížky
    SCJP Sun Certified Programmer for Java 6 Exam 310-065

    Dále pak ze slidů pana Hnětynky, který přednáší Javu na MFF:
    http://dsrg.mff.cuni.cz/~hnetynka/teaching/java/slides2009/java04.pdf

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

*

Můžete používat následující HTML značky a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>