前面的讨论中留下了一个问题,还没有分析完。就是表示“币种”的数据类型。因此继续讨论的话就要超出了面试题目的范围,所以另开一文。
如果对币种信息的要求只是为了区别不同Money对象所代表的货币种类,以保证只有相同币种的Money对象才能进行计算,那么无论是String, int还是enum都够了。但是,在一个稍大一点的项目中,要求可能都不会仅限于此。比如需要在显示金额的时候能显示正确的货币符号,或者一些系统中还需要显示3位的币种代码,比如用USD表示美元,RMB表示人民币。在有用户输入或者和其它系统交互的情况下,还会需要判断输入的数据是否是合法的,系统支持的币种。有这些需求的情况下,自然的,我们需要一个单独的类Currency。至于在Currency内部使用具体什么类型,参见前一篇中的讨论。
因此,Money类应该是这个样子的:
public class Money {
private Currency currency;
private BigDecimal amount;
public Money (Currency aCurrency, BigDecimal aAmount) {
...
}
public Money add (Money aMoney)
throws IncompatibleCurrencyException {
...
}
public Money subtract (Money aMoney)
throws IncompatibleCurrencyException {
...
}
}
如果系统中需要由用户来维护系统所能支持的币种,那么一般需要在数据库中维护一张表,此时Currency就是一个可持久化类了。
关于这个设计问题,还请参看我前面翻译的那篇“Prefactoring”的2.6节。虽然那篇文章主要讨论的是分析和领域建模阶段,但是很多讨论对于设计阶段仍然是有效的。