1   package junit.samples.money;
2   
3   /***
4    * A simple Money.
5    *
6    */
7   public class Money implements IMoney {
8   
9   	private int fAmount;
10  	private String fCurrency;
11  
12  	/***
13  	 * Constructs a money from the given amount and currency.
14  	 */
15  	public Money(int amount, String currency) {
16  		fAmount= amount;
17  		fCurrency= currency;
18  	}
19  	/***
20  	 * Adds a money to this money. Forwards the request to the addMoney helper.
21  	 */
22  	public IMoney add(IMoney m) {
23  		return m.addMoney(this);
24  	}
25  	public IMoney addMoney(Money m) {
26  		if (m.currency().equals(currency()) )
27  			return new Money(amount()+m.amount(), currency());
28  		return MoneyBag.create(this, m);
29  	}
30  	public IMoney addMoneyBag(MoneyBag s) {
31  		return s.addMoney(this);
32  	}
33  	public int amount() {
34  		return fAmount;
35  	}
36  	public String currency() {
37  		return fCurrency;
38  	}
39  	public boolean equals(Object anObject) {
40  		if (isZero()) 
41  			if (anObject instanceof IMoney)
42  				return ((IMoney)anObject).isZero();
43  		if (anObject instanceof Money) {
44  			Money aMoney= (Money)anObject;
45  			return aMoney.currency().equals(currency())
46  							 && amount() == aMoney.amount();
47  		}
48  		return false;
49  	}
50  	public int hashCode() {
51  		return fCurrency.hashCode()+fAmount;
52  	}
53  	public boolean isZero() {
54  		return amount() == 0;
55  	}
56  	public IMoney multiply(int factor) {
57  		return new Money(amount()*factor, currency());
58  	}
59  	public IMoney negate() {
60  		return new Money(-amount(), currency());
61  	}
62  	public IMoney subtract(IMoney m) {
63  		return add(m.negate());
64  	}
65  	public String toString() {
66  		StringBuffer buffer = new StringBuffer();
67  		buffer.append("["+amount()+" "+currency()+"]");
68  		return buffer.toString();
69  	}
70  	public /*this makes no sense*/ void appendTo(MoneyBag m) {
71  		m.appendMoney(this);
72  	}
73  }