japod@6: package org.apidesign.apifest08.currency; japod@6: japod@6: import java.io.Serializable; japod@6: import java.math.BigDecimal; japod@6: import java.util.Currency; japod@6: japod@6: /** japod@6: * Default implementation of {@link Money} interface. This class is immutable. japod@6: * @author lukas japod@6: * japod@6: */ japod@6: public final class MoneyImpl implements Serializable, Money{ japod@6: private static final long serialVersionUID = -6091808475616516136L; japod@6: japod@6: private final BigDecimal amount; japod@6: japod@6: private final Currency currency; japod@34: japod@6: public MoneyImpl(BigDecimal amount, Currency currency) { japod@6: if (amount==null) throw new NullPointerException("Amount is null"); japod@6: if (currency==null) throw new NullPointerException("Currency is null"+currency); japod@16: this.amount = amount; japod@6: this.currency = currency; japod@6: } japod@6: japod@34: japod@34: japod@6: public MoneyImpl(long amount, Currency currency) { japod@6: this(BigDecimal.valueOf(amount), currency); japod@6: } japod@6: japod@6: public MoneyImpl(double amount, Currency currency) { japod@6: this(BigDecimal.valueOf(amount), currency); japod@6: } japod@34: japod@34: /** japod@34: * Factory method. japod@34: * @param amount japod@34: * @param currency japod@34: * @return japod@34: */ japod@34: public static final Money money(BigDecimal amount, Currency currency) japod@34: { japod@34: return new MoneyImpl(amount, currency); japod@34: } japod@34: /** japod@34: * Factory method. japod@34: * @param amount japod@34: * @param currency japod@34: * @return japod@34: */ japod@34: public static final Money money(long amount, Currency currency) japod@34: { japod@34: return new MoneyImpl(amount, currency); japod@34: } japod@34: /** japod@34: * Factory method. japod@34: * @param amount japod@34: * @param currency japod@34: * @return japod@34: */ japod@34: public static final Money money(double amount, Currency currency) japod@34: { japod@34: return new MoneyImpl(amount, currency); japod@34: } japod@6: japod@16: /** japod@16: * Returns amount. japod@16: * @return japod@6: */ japod@6: public BigDecimal getAmount() { japod@6: return amount; japod@6: } japod@6: japod@16: /** japod@16: * Returns currency. japod@6: */ japod@6: public Currency getCurrency() { japod@6: return currency; japod@6: } japod@6: japod@6: @Override japod@6: public int hashCode() { japod@6: final int prime = 31; japod@6: int result = 1; japod@6: result = prime * result + ((amount == null) ? 0 : amount.hashCode()); japod@6: result = prime * result japod@6: + ((currency == null) ? 0 : currency.hashCode()); japod@6: return result; japod@6: } japod@6: japod@6: @Override japod@6: public boolean equals(Object obj) { japod@6: if (this == obj) japod@6: return true; japod@6: if (obj == null) japod@6: return false; japod@6: if (!(obj instanceof MoneyImpl)) japod@6: return false; japod@6: MoneyImpl other = (MoneyImpl) obj; japod@6: if (amount == null) { japod@6: if (other.amount != null) japod@6: return false; japod@16: } else if (amount.compareTo(other.amount)!=0) japod@6: return false; japod@6: if (currency == null) { japod@6: if (other.currency != null) japod@6: return false; japod@6: } else if (!currency.equals(other.currency)) japod@6: return false; japod@6: return true; japod@6: } japod@6: japod@6: @Override japod@6: public String toString() { japod@6: return getClass().getName()+"["+currency+amount+"]"; japod@6: } japod@6: japod@6: japod@6: japod@6: }