5. seminář - Výčtové typy

TEACHINGJJ1

Metody s proměnným počtem argumentů

V javě je možné definovat metodu s proměnným počtem argumentů. Definice vypadá následovně:


    int sum(int ... numbers) {
        int result = 0;
        for (int number : numbers) {
            result += number;
        }
        return result;
    }

Enum (výčtové typy)

  • Programátorem definovaný konečně-hodnotový datový typ.
  • V Javě může mít každá hodnota enumu nějaké své vlastnosti.
  • Můžeme přidat i metody.
  • Nelze vytvářet nové instance. Tj instance jsou právě naše prvky výčtu.
  • Nelze dědit.
  • Lze přes ně iterovat (statická metoda values() vrátí všechny prvky enumu).

Definice výčtového typu


    public enum Weekday {
        //nejprve výčet prvků (máme-li konstruktor s parametry, tak v závorkách je předáme
        MONDAY(1, "Monday"),
        TUESDAY(2, "Tuesday"),
        WEDNESDAY(3, "Wednesday"),
        THURSDAY(4, "Thursday"),
        FRIDAY(5, "Friday"),
        SATURDAY(6, "Saturday"),
        SUNDAY(7, "Sunday");  //jsou to konstanty, dle konvencí píšeme velkým
    
    
        // Pomocné atributy
        private int index; 
    
        private String description;
        
        // Konstruktor (privátní, funguje jen pro konstatny výše, 
        // zkuste jej zavoalt sami níže...)
        Weekday(int index, String description){
            this.index = index;
            this.description = description;
        }
    
        public int getIndex() {
            return index;
        }
    
        public String getDescription() {
            return description;
        }
    
        public boolean isBestDay(){
            return this.equals(THURSDAY);
        }
    
        // Muzeme definovat staticke metody
        public static void tryMe(){
            //Weekday weekday = new Weekday(3, "Wednesday"); // ... nepůjde
        }
    }

Použití


    public static void main(String[] args) {
        WeekDay day = WeekDay.MONDAY;
        
        switch (day) {
            case MONDAY:
                System.out.println("I hate mondays.");
                break;
                .
                .
                .
            case SUNDAY:
                System.out.println("Moday tomorrow again!");
                break;
        }
    }

Příklad z minulého semináře vyřešený pomocí výčtových typů si můžete stáhnout zde.

Úkoly

Napište statickou metodu String formatStr(String format, Object... args), která vrátí řetězec, kde budou nahrazeny podřetězce %<cislo> hodnotou příslušného argumentu. <cislo> může být libovolné nezáporné číslo.

Příklad:


    formatStr("A: %0; B: %1", 1, 1.6); // ===> "A: 1; B: 1.6"

Napište třídu AnimalFarm evidující informace o zvířatech na statku. Třída bude mít dvě metody:

  • add -- přidá do seznamu zvíře a o něm následující informace: jméno, druh zvířete, pohlaví.
  • list -- vypíše seznam zvířat ve tvaru:
    
        Alík je pes a dělá "haf-haf".
        Bobík je kačena a dělá "ga-ga".
        Chubaka je fena a dělá "haf-haf".
        Donald je kačer a dělá "ga-ga".     
    
    

Navrhěte vhodné výčtové typy pro reprezentaci zvířat.