toString() mindenbe

Az előző oldalon az volt a feladat, hogy egy Innivalo toString-je írja ki az innivaló tulajdonságait. Nekem valami ilyesmi lett:

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


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

    public String toString() {
        return nev+", "+felszolgaltMeret+" deci, "+alkoholTartalomSzazalek+"%";
    }
}

Ekkor az eredmény:

Jack most feladta, mert szünetre van szüksége!
Jack ezt itta:
  Kozel sör, 5.0 deci, 4.0%
  Kozel sör, 5.0 deci, 4.0%
  Törkölypálinka, 0.5 deci, 40.0%
Jane ezt itta:
  Törkölypálinka, 0.5 deci, 40.0%

No ez már döfi! De mi lenne, ha az Ember-nek is csinálnánk rendes toString-et? Akkor az Ember össze tudja szedni a nevét, akár azt is, hogy összesen mennyit ivott, és persze hozzátehetné a megivott italok listáját is, hogy ne a Kocsma-ban kelljen ezt kitúrni.

Kinek a feladata?

Képzeld el valóságban. Jack-tól kéred, hogy mutassa, mit ivott (illetve ha már mutatja, az nem jó), vagy a Kocsma-tól? Jack-tól! Tehát eddig kicsit csúnya volt tőlünk, hogy a Kocsmában voltak azok a for-each ciklusok. No akkor fixáljuk meg, legyen az Embernek toString-je!

Először is, az Ember osztályba tegyünk egy hercig toString-et:

public String toString() {
    return nev+" megivott "+ivottMennyiseg+" deci italt, össz. "+ivottMennyiseg+" deci alkohol tartalom.";
}

Másodszor is, guberáljuk ki a Kocsma kódból a catch ágból a vacakolást a mindenféle printekkel meg for-each ciklusokkal:

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);
        System.out.println(jane);
    }
}

Huhh? Ugyeugye, nocsak, nalám? Ki lehet írni jack meg jane "értékét", mennyivel olvashatóbb már a kód!

Ez az eredmény:

Jack most feladta, mert szünetre van szüksége!
Jack megivott 10.5 deci italt, össz. 10.5 deci alkohol tartalom.
Jane megivott 0.5 deci italt, össz. 0.5 deci alkohol tartalom.

Feladat: tedd bele az italok listáját!

De hopp, a for each ciklust kidobtuk ugyan a Kocsma kódjából, de bele kellene tenni az Ember toString-jébe, hogy amikor kiírjuk Jack értékét, akkor listázza a megivott italokat is.