Jegyezze meg az Ember, hogy mit ivott

Most már mindennel fel vagyunk vértezve, hogy az Ember tudja követni, mit ivott.

Ezt fogjuk csinálni:

Vágjunk bele! Vedd elő az előző részben készült kocsma programot! Itt tartottunk, összesen hat pici osztály, ami leírja a kocsma működését:

public class Innivalo {
    double felszolgaltMeret=5; // dl
    double alkoholTartalomSzazalek=4; // %      

    Innivalo(double felszolgaltMeret,double alkoholTartalomSzazalek) {
        this.felszolgaltMeret=felszolgaltMeret;
        this.alkoholTartalomSzazalek=alkoholTartalomSzazalek;
    }
}

public class Bor extends Innivalo {
    Bor() {
        super(1,12); // 1 dl, 12%
    }
}

public class Sor extends Innivalo {
    Sor() {
        super(5,4); // 5 dl, 4%
    }
}

public class Palinka extends Innivalo {
    Palinka() {
        super(0.5,40); // 0.5 dl, 40%
    }
}

public class Ember {
    double fogyasztottAlkohol=0;
    double alkoholTures=1;
    String nev;
    double ivottMennyiseg=0;

    Ember(String nev,double alkoholTures) {
        this.nev=nev;
        this.alkoholTures=alkoholTures;
    }


    void igyal(Innivalo innivalo) {
        fogyasztottAlkohol+=innivalo.felszolgaltMeret*innivalo.alkoholTartalomSzazalek/100;

        if (fogyasztottAlkohol>alkoholTures) {
            // ez itt az exception
            throw new RuntimeException("Jajj, ez sok volt! "+nev+" kidolt!"); 
        }

        ivottMennyiseg+=innivalo.felszolgaltMeret;
        if (ivottMennyiseg>10) { // ez akkor 1 liter, mert deciben számolunk
            // ez itt az exception
            throw new RuntimeException(nev+" most feladta, mert szünetre van szüksége!"); 
        }

    }
}


public class Kocsma {
    public static void main(String[] args) {
        Ember jack=new Ember("Jack",1.2); 
        Ember jane=new Ember("Jane",1);

        jack.igyal(new Sor());
        jack.igyal(new Sor());

        jane.igyal(new Palinka()); 

        jack.igyal(new Palinka()); 
        jack.igyal(new Palinka()); 

        jane.igyal(new Bor()); 

    }
}

Az Ember osztályt kell felokosítani, hogy emlékezzen, mit ivott:

public class Ember {
    double fogyasztottAlkohol=0;
    double alkoholTures=1;
    String nev;
    double ivottMennyiseg=0;

    // ez a konténer
    List<Innivalo> innivalok=new ArrayList<>();

    Ember(String nev,double alkoholTures) {
        this.nev=nev;
        this.alkoholTures=alkoholTures;
    }

    void igyal(Innivalo innivalo) {
        // eltároljuk hogy mit ivott
        innivalok.add(innivalo);

        fogyasztottAlkohol+=innivalo.felszolgaltMeret*innivalo.alkoholTartalomSzazalek/100;

        if (fogyasztottAlkohol>alkoholTures) {
            throw new RuntimeException("Jajj, ez sok volt! "+nev+" kidolt!"); 
        }

        ivottMennyiseg+=innivalo.felszolgaltMeret;
        if (ivottMennyiseg>10) { // ez akkor 1 liter, mert deciben számolunk
            throw new RuntimeException(nev+" most feladta, mert szünetre van szüksége!"); 
        }   
    }
}

Ugye nem tévedtél el benne? Két értelmes sort írtam hozzá:

// ez a konténer
List<Innivalo> innivalok=new ArrayList<>();

// eltároljuk hogy mit ivott
innivalok.add(innivalo);

A kocsmában az ivásokat tegyük egy try..catch közé, és ha jött egy exception, akkor:

public class Kocsma {

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

            jane.igyal(new Palinka()); 

            jack.igyal(new Palinka()); 
            jack.igyal(new Palinka()); 

            jane.igyal(new Bor()); 

            jack.igyal(new Palinka()); 
            jack.igyal(new Sor());
            jack.igyal(new Palinka()); 
            jack.igyal(new Sor());

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

        System.out.println("Jack ezt itta:");
        for (Innivalo innivalo:jack.innivalok) {
            System.out.println("  "+innivalo);
        }

        System.out.println("Jane ezt itta:");
        for (Innivalo innivalo:jane.innivalok) {
            System.out.println("  "+innivalo);
        }

    }

}

Ehhez is mindent tudtál, igaz? Egy Exception-nak van egy getMessage metódusa, ami visszaadja az exception szövegét, ezt írjuk ki. Mivel elkaptuk az exception-t, az nem állítja le a programot, és megy tovább, ahol két for-each ciklussal kiírjuk, hogy ki mit ivott. Trallala, nem is volt nehéz, ugye?

Jack most feladta, mert szünetre van szüksége!
Jack ezt itta:
  Sor@15db9742
  Sor@6d06d69c
  Palinka@7852e922
Jane ezt itta:
  Palinka@7852e922

No, várjunk csak, mi az hogy Palinka@7852e922? Én ilyet ugyan sehova sem írtam! Honnan veszi ezt? De mit is csinálok? Kiírom az innivalot. Az innivalo nem primitív típus, nincs egyetlen értéke, akkor most mit írjon ki?

System.out.println("  "+innivalo);

A rejtély megoldása a következő oldalon...