对于 itemsCount 和 totalPrice 这两个属性来说,定义一个 public 的 getter 方法,确实
无伤大雅,毕竟 getter 方法不会修改数据。但是,对于 items 属性就不一样了,这是因为
items 属性的 getter 方法,返回的是一个 List集合容器。外部调用者在拿到这个容器之
后,是可以操作容器内部数据的,也就是说,外部代码还是能修改 items 中的数据。比如
像下面这样:
你可能会说,清空购物车这样的功能需求看起来合情合理啊,上面的代码没有什么不妥啊。
你说得没错,需求是合理的,但是这样的代码写法,会导致 itemsCount、totalPrice、
items 三者数据不一致。我们不应该将清空购物车的业务逻辑暴露给上层代码。正确的做法
应该是,在 ShoppingCart 类中定义一个 clear() 方法,将清空购物车的业务逻辑封装在里
面,透明地给调用者使用。ShoppingCart 类的 clear() 方法的具体代码实现如下:
你可能还会说,我有一个需求,需要查看购物车中都买了啥,那这个时候,ShoppingCart
类不得不提供 items 属性的 getter 方法了,那又该怎么办才好呢?
如果你熟悉 Java 语言,那解决这个问题的方法还是挺简单的。我们可以通过 Java 提供的
Collections.unmodifiableList() 方法,让 getter 方法返回一个不可被修改的
UnmodifiableList 集合容器,而这个容器类重写了 List 容器中跟修改数据相关的方法,比
如 add()、clear() 等方法。一旦我们调用这些修改数据的方法,代码就会抛出
UnsupportedOperationException 异常,这样就避免了容器中的数据被修改。具体的代
码实现如下所示。
复制代码
1
2
3
ShoppingCart cart = new ShoppCart();
...
cart.getItems().clear(); // 清空购物车
复制代码
1
2
3
4
5
6
7
8
public class ShoppingCart {
// ... 省略其他代码...
public void clear() {
items.clear();
itemsCount = 0;
totalPrice = 0.0;
}
}