© APSIS GmbH extern.gif (1249 Byte), Polling, 2000


Eimer

Datenbehälter aus der Bibliothek für das Lehrbuch Programmieren mit Java.

Dokumentation Programmtext ohne Dokumentation


/*
 * @(#)Eimer.java
 *	Bibliothek für das Lehrbuch in Java
 *	@author Prof. Solymosi, (c): APSIS GmbH
 *	@version 3.0
 *	@date 28. August 2000
*/
package lehrbuch;
/** Datenbehälter "Animierter Eimer".
Klasse zum Ausprägen.
Vier Eimer können am Bildschirm dargestellt werden (Methode "anzeigen").
Für alle weiteren Objekte gibt es nur eine textuelle Anzeige (Methode "meldung").
Sie können (mit Getränk) gefüllt und entleert werden (Methoden "fuellen" und "entleeren").
Als Getränke stehen "Eimer.WASSER" und "Eimer.WEIN" zur Verfügung. 
(Weitere Getränke müssen mit pnpgui korrespondierend programmiert werden).
Wenn die Reihenfolgebedingungen verletzt werden, geprüfte Ausnahmen "lehrbuch.VollAusnahme" und "lehrbuch.LeerAusnahme" werden ausgelöst.
Konstruktoren:
parameterloser Konstruktor für ein Eimerobjekt, das explizit angezeigt werden muß.
Konstruktor mit "boolean"-Parameter für ein angezeigtes Eimerobjekt.
Konstruktor mit "Getraenk"-Parameter für ein gefülltes Eimerobjekt.
Reihenfolgebedingungen:
Als erster Mutator muß "fuellen" aufgerufen werden.
Anschließend dürfen "entleeren" und "fuellen" nur abwechselnd aufgerufen werden, sonst Ausnahme.
"inhalt" darf auch nur bei vollem Eimer gerufen werden, sonst Ausnahme.
*/
public class Eimer implements Cloneable {
	// öffentliche Konstanten:
	public final static Getraenk WASSER = Getraenk.WASSER; 
	public final static Getraenk WEIN = Getraenk.WEIN; 
        /** Wertefunktion 
        	@return in den Eimer passender Getraenk-Wert WASSER
        */
        public static Getraenk wasser() {
                return WASSER;
        }
        /** Wertefunktion
	        @return in den Eimer passender Getraenk-Wert WEIN
        */
        public static Getraenk wein() {
                return WEIN;
        }
        // Konstruktoren:
        /** Konstruktor für einen leeren unsichtbaren Eimer */
        public Eimer() { 
                eimerPos = UNSICHTBAR;
                eimerGefuellt = false;
                eimerInhalt = WASSER;
        }
        /** Kopierkonstruktor */
        public Eimer(final Eimer eimer) { 
                this();
                eimerGefuellt = eimer.eimerGefuellt;
                eimerInhalt = eimer.eimerInhalt;
        }
        /** Konstruktor für einen leeren sichtbaren Eimer */
        public Eimer(final boolean b) {
                this();
                anzeigen();
        }
        /** Konstruktor für einen gefuellten Eimer */
        public Eimer(final Getraenk g) { 
                this();
                try {
                        fuellen(g);
                }
                catch (VollAusnahme ausnahme) {
                        System.err.println("Interner Fehler in Eimer(Getraenk): " + ausnahme);
                } // kann nicht passieren
        }
        /** Konstruktor für einen gefuellten sichtbaren Eimer */
        public Eimer(final Getraenk g, final boolean b) {
               this(g);
                anzeigen();
        }
        // Mutatoren
        /** Eimer wird animiert mit "getraenk" gefüllt, wenn leer.
	        @param getraenk const WASSER oder WEIN
	        @exception VollAusnahme wenn Eimer voll
        */
        public void fuellen(final Getraenk getraenk) throws VollAusnahme {
                if (eimerGefuellt)
                        throw new VollAusnahme();
                else {
                        eimerGefuellt = true;
                        eimerInhalt = getraenk;
                        if (eimerPos != UNSICHTBAR)
                                Anim.eimerFuellen(eimerPos, eimerInhalt.pos());
                                // am Bildschirm wird das Fuellen des Eimers angezeigt
                }
        }
        /** Eimer wird animiert mit WASSER gefüllt, wenn leer
	        @exception VollAusnahme wenn Eimer voll
        */
        public void fuellen() throws VollAusnahme { 
                fuellen(WASSER);
        }
        /** Eimer wird animiert entleert, wenn voll
	        @exception LeerAusnahme wenn Eimer leer
        */
        public void entleeren() throws LeerAusnahme { 
                if (! eimerGefuellt)
                        throw new LeerAusnahme();
                else {
                        eimerGefuellt = false;
                        if (eimerPos != UNSICHTBAR)
                                Anim.eimerEntleeren(eimerPos, eimerInhalt.pos());
                        // am Bildschirm wird das Entleeren des Eimers angezeigt
                }
        }
        // Informatoren:
        /** Zustandsinformator
	        @return true wenn der Eimer gefüllt ist
        */
        public boolean gefuellt() { 
                return eimerGefuellt;
        }
        /** Informator
	        @return enthaltener Getränk
        	@exception LeerAusnahme wenn Eimer leer
        */
        public Getraenk inhalt() throws LeerAusnahme { 
                if (eimerGefuellt)
                        return eimerInhalt;
                else
                        throw new LeerAusnahme();
        }
        /** Der unsichtbare Eimer wird angezeigt; kein Effekt für einen sichtbaren Eimer.
	        @exception FuenfterEimerFehler wenn schon vier Eimer sichtbar (ungeprüfte Ausnahme)
        */
        public void anzeigen() throws FuenfterEimerFehler { 
                if (eimerPos == UNSICHTBAR) {
                        if (naechstePos == UNTEN_RECHTS)
                                throw new FuenfterEimerFehler();
                        else {
                                naechstePos++;
                                eimerPos = naechstePos;
                        }
                }
                if (eimerGefuellt)
                        Anim.vollenEimerZeigen(eimerPos, eimerInhalt.pos()); 
                else
                        Anim.leerenEimerZeigen(eimerPos);
        }
        /** lokale ungeprüfte Ausnahme wird ausgelöst, wenn mehr als 4 Eimer angezeigt werden sollen */
        public class FuenfterEimerFehler extends Error {}
        // Kopieren und Vergleich:
        /** kopiert Eimerinhalt
	        @param quelle const der zu kopierende Eimer
        */
        public void kopieren(final Eimer quelle) {
                eimerGefuellt = quelle.eimerGefuellt;
                eimerInhalt = quelle.eimerInhalt;
                anzeigen();
        }
        /** vergleicht Füllzustand und Inhalt.
	        // const
	        @param eimer const der zu vergleichende Eimer
	        @see Eimer#identisch
        */
        public boolean istGleich (final Eimer eimer) { 
                return (!eimerGefuellt && ! eimer.eimerGefuellt) || // beide leer, oder
                        eimerGefuellt && eimer.eimerGefuellt && // beide voll, und
                        eimerInhalt.equals(eimer.eimerInhalt); // gleicher Inhalt
        }
        /** vergleicht Inhalt und Position.
	        const
	        @param eimer const der zu vergleichende Eimer
        	@see Eimer#istGleich
        */
        public boolean identisch (final Eimer eimer) { // vergleicht Inhalt und Position
                return  (istGleich(eimer) && eimerPos == eimer.eimerPos);
        }
        // Kommunikationsmethoden:
        /** Ausgabe des Inhalts im Meldungsfenster.
        	const
	        Beim Aufruf erscheint ein Meldungsfenster. Es muß bestätigt werden.
        	@exception LeerAusnahme wenn Eimer leer
	        @see Eimer#meldung(Getraenk)
        */
        public void meldung() throws LeerAusnahme { // 
                if (! eimerGefuellt)
                        throw new LeerAusnahme();
                else
                        Anim.meldung(eimerInhalt.text(), "Eimerinhalt");
        }
        /** Ausgabe eines Getraenks im Meldungsfenster.
        	const
	        Beim Aufruf erscheint ein Meldungsfenster. Es muss bestätigt werden.
        	@param getraenk const das auszugebende Getränk
	        @see Eimer#meldung(String)
        */
        public static void meldung(final Getraenk getraenk) { 
                Anim.meldung(getraenk.text(), "Getränk");
        }
        /** Textausgabe im Meldungsfenster.
        	const
        	Beim Aufruf erscheint ein Meldungsfenster. Es muss bestätigt werden.
	        @param text const der auszugebende Text
	        @see Programm#meldung(String)
        */
        public static void meldung(final String text) { 
                Programm.meldung(text);
        }
        /** Textausgabe im Meldungsfenster mit Titel.
        	const
	        Beim Aufruf erscheint ein Meldungsfenster. Es muß bestätigt werden.
        	@param text const der auszugebende Text
	        @param titel const der auszugebende Text
	        @see Programm#meldung(String, String)
        */
        public static void meldung(final String text, final String titel) {
             Programm.meldung(text, titel);
        }
        // Füllen von der Oberfläche:
	/** Auswahlliste für ein Getränk
        	Beim Aufruf erscheint eine Auswahlliste mit WASSER und WEIN.
	        Der Eimer wird entleert (wenn voll) und mit dem ausgewählten Getränk gefüllt.
        	@see Eimer#getraenkEingabe
        */
        public void getraenkWahl() {
                try {
                        entleeren();
                } catch (LeerAusnahme ausnahme) {} // wenn leer, OK
                Getraenk getraenk = Getraenk.WASSER;
                getraenk = (Getraenk)getraenk.auswahl();
                try {
                        fuellen(getraenk);
                } catch (VollAusnahme ausnahme) {} // ist schon leer
        }
        /** Eingabefenster für ein Getränk 
	        Beim Aufruf erscheint ein Eingabefenster; "WASSER" oder "WEIN" muß eingetippt werden.
        	Wenn nicht "Wasser" oder "Wein" eingetippt wird, wird getraenkWahl aufgerufen.
	        Der Eimer wird entleert (wenn voll) und mit dem eingetippten Getränk gefüllt.
        	@see Eimer#getraenkWahl
        */
        public void getraenkEingabe() { 
                try {
                        entleeren();
                } catch (LeerAusnahme ausnahme) {} // wenn leer, OK
                Getraenk getraenk = Getraenk.WASSER;
                try {
                        getraenk = (Getraenk)getraenk.eingabe();
                } catch (BereichAusnahme ausnahme) {
                        getraenk = (Getraenk)getraenk.auswahl();
                }
                try {
                        fuellen(getraenk);
                } catch (VollAusnahme ausnahme) {} // ist schon leer
        }
        // Klonen
        /** Eimerinhalt wird in einen neuen Eimer kopiert.
	        @param eimer const der zu kopierende Eimer
	*/
        public Object clone(final Eimer eimer) {
                try {
                        return super.clone();
                } catch(CloneNotSupportedException ausnahme) { // kann nicht auftreten
                        System.err.println("Interner Fehler in Eimer.clone " + ausnahme);
                        throw new InternalError();
                }
        }
        // nur für Unterklassen:
        /** Der Eimer wird animiert gefüllt, wenn leer
		@exception VollAusnahme wenn voll
	*/
        protected void fuellenMitWein() throws VollAusnahme { 
                fuellen(WEIN);
        }
        // private Teile:
        // Objektkomponenten:
        private boolean eimerGefuellt;
        private Getraenk eimerInhalt; // WASSER oder WEIN
        private int eimerPos; // Position des Eimers 0 .. 4
        // Klassenkomponente:
        private static int naechstePos; // Position des letzten angezeigten Eimers
        // Initialisierung der Klassenkomponente:
        static {
                naechstePos = 0; 
        }
        // private Konstanten:
	private static final int UNSICHTBAR = 0;
	private static final int OBEN_LINKS = 1;
	private static final int OBEN_RECHTS = 2;
	private static final int UNTEN_LINKS = 3;
	private static final int UNTEN_RECHTS = 4;
}
/*
 * @(#)Getraenk.java
 *	Bibliothek für das Lehrbuch in Java
 *	@author Prof. Solymosi, (c): APSIS GmbH
 *	@version 1.0
 *	@date 7. Oktober 1998
*/
package lehrbuch;
/** Inhalt für einen Datenbehälter implementiert durch die Klasse.
	@see Eimer
*/
public class Getraenk extends Aufz {
	public static final Getraenk WASSER = new Getraenk();
	public static final Getraenk WEIN = new Getraenk();
}

© APSIS GmbH extern.gif (1249 Byte), Polling, 2000