11.2.2 Lösungen (Assertions)

Übung 1: Einfügen von Assertions

Klasse Euro

package s1.block11;
import static java.lang.Math.abs;
import static java.lang.Math.signum;
/**
 *
 * @author s@scalingbits.com
 * @version 1.1
 */
public class Euro extends Number implements Waehrung, Comparable{
    /**
     * Der gesamte Betrag wird intern in Cents verwaltet
     */
    public final long cents;
 
    public Euro(long euros, long cents) {
        assert ((cents>=0) && (cents < 101)): "Cents Bereichsverletzung";
        // Ignoriere Centsbetrag wenn er nicht im richtigen Intervall ist
        if ((cents<0) || (cents>=100))
            cents=0;
       this.cents = (abs(euros)*100+cents) *(long)signum(euros);
    }
    @Override
    public int intValue() {
        return (int)cents/100;
    }
    @Override
    public long longValue() {
        return cents/100;
    }
    @Override
    public float floatValue() {
        // Signum und Absolutwert sind notwendig
        // da -2.20= -(2 + 0.2) sind. Falsch: -2 + 0.2 ergibt -1.8!
        return (float)cents/100f;
    }
    @Override
    public double doubleValue() {
        // Signum und Absolutwert sind notwendig
        // da -2.20= -(2 + 0.2) sind. Falsch: -2 + 0.2 ergibt -1.8!
        return (double)cents/100d;
    }
    @Override
    public String symbol() {
        return "€";
    }
    @Override
    public String toString() {
        // Füge eine Null bei Centbeträgen zwischen 0 und 9 eine
        String leerstelle = ((abs(cents)%100)<10) ? "0" : "";
        return Long.toString(cents/100L) + "." + leerstelle +
                Long.toString(abs(cents%100L)) + symbol();
    }
    @Override
    public Waehrung mult(double d) {
        assert (d!=0): "Multplikation mit " + d + "nicht erlaubt";
        long temp;
        temp = (long)((double)cents *d);
        return new Euro(temp/100L,abs(temp%100L));
    }
    @Override
    public int compareTo(Object o) {
    int result;
        if (o instanceof Euro) {
            Euro e = (Euro) o;
            result = (int)(this.cents-e.cents);
        }
        else {result = -1;} // Alles was kein Euro ist, ist kleiner
    return result;
    }
}