Archiv pro měsíc: Prosinec 2009

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());
        }
    }
}