A bárpultos

Az eddigi kocsmánkban van egy alapvető csalás. Mivel már átlátod a kódot, megmutatom. Ez az:

jack.igyal(new Sor());

Mi ebben a csalás? Hát az, hogy jack nem szokott magától sört gyártani! Ez nem egy olyan önkiszolgáló kocsma, amibe a vendékek legyártják az innvalójukat, aztán megisszák, nem?

Hogy van a valóságban? A valóságban a pultos tölt egy italt. Mégvalóságabban a Kocsma többféle italból rendelkezik készlettel, és a pultos csak azt töltheti ki, ami éppen maradt. De kezdjük csak az elejével, és legyen egy pultos, aki lelkesen ad egy italt!

Csinálj egy új osztált Pultos névvel! Legyen neki egy "agggyáegyet" metódusa, ami ad egy italt. Mondjuk kezdjük azzal, hogy egy sört ad:

public class Pultos {

    Innivalo adjEgyet() {
        return new Sor();
    }
}

A Kocsma osztályban létrehozzuk feri, a pultost:

public class Kocsma {

    public static void main(String[] args) {
        Ember jack=new Ember("Jack",1.2);
        Ember jane=new Ember("Jane",1);
        Pultos feri=new Pultos();
        try {
            jack.igyal(feri.adjEgyet());
            jane.igyal(feri.adjEgyet()); 

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        System.out.println(jack);
        System.out.println(jane);
    }

}

No és ahelyett, hogy jack meg jane készítene Innivaló példányokat magának, inkább feritől kérnek egyet:

jack.igyal(feri.adjEgyet());
jane.igyal(feri.adjEgyet());

Persze Feri egyelőre nem túl fantáziadús, hiszen mindig sört ad:

Jack megivott 5.0 deci italt, össz. 0.2 deci alkohol tartalom.
  Kozel sör, 5.0 deci, 4.0%

Jane megivott 5.0 deci italt, össz. 0.2 deci alkohol tartalom.
  Kozel sör, 5.0 deci, 4.0%

Adjon Feri mindenfélét

Milyen jó lenne, ha Feri mindenféle italokat adna, véletlenszerűen! Ehhez kellene nekünk valami, ami tud véletlenszámokat adni - naná hogy van rá egy osztály! A neve Random! Miután létrehoztunk, a nextInt metódusával fog tudni nekünk adni véletlenszerű egész számokat, mégpedig a nextInt-el azt is meg lehet mondani, hogy milyen tartományban. A nextInt(3) például háromféle szám közül ad egyet: 0,1,2.

Aztán ha megvan a szám, akkor utána egy adag if-el vagy sört, vagy bort, vagy pálinkát adunk vissza:

public class Pultos {
    Random veletlen = new Random();

    Innivalo adjEgyet() {
        int melyiket=veletlen.nextInt(3); // 0, 1, 2

        if (melyiket==0) {
            return new Sor();
        }
        if (melyiket==1) {
            return new Bor();
        }
        return new Palinka();
    }
}

Import

A Random osztályt is importálni kell, ctrl+shift+o

Mivel a Sor, Bor, Palinka egyaránt Innivalo leszármazott, ezért ez a metódus ami Innivalo-t ad vissza, visszaadhatja bármelyiket.

Ha van egy macskaajtó, azon átmehet a házimacska, perzsamacska, stb... hiszen azok mind Macska származékok, nemde?

Feladat: próbálkozz és ellenőrizd, hogy mindig másféle italokat fogyaszottak!

Vegyük case-be (kézbe) a dolgokat

Ez a sok fura if elég sok hibalehetőséget rejt. Talán egyszerűbb lenne a switch..case szerkezetet felhasználni. Ilyen volt C-ben is, és az egész arra jó, hogy a sok kicsi if-et kiváltsa egy egyszerűbb irásmóddal.

public class Pultos {
    Random veletlen = new Random();

    Innivalo adjEgyet() {
        int melyiket=veletlen.nextInt(3); // 0, 1, 2
        switch(melyiket) {
        case 0:
            return new Sor();
        case 1:
            return new Bor();
        default:
            return new Palinka();
        }
    }
}

Sőt, a melyiket változó sem kell, hiszen a véletlenszám kiszámolását oda lehet tenni a switch belsejébe:

public class Pultos {
    Random veletlen = new Random();

    Innivalo adjEgyet() {
        switch(veletlen.nextInt(3)) {
        case 0:
            return new Sor();
        case 1:
            return new Bor();
        default:
            return new Palinka();
        }
    }
}

Ha a kiszámolt véletlen szám értéke 0, akkor a case 0: utáni rész hajtódik végre. Ha 1 az értéke, akkor a case 1: utáni. Egyéb esetben (ha pld. 2 lett) akkor meg a default: utáni. Ennyi az egész.