上一篇博客说到 面向对象的封装特性,只对外暴露该暴露的方法和属性
但是对于Collection类型的属性,我们在日常开发中通常没有注意,比如这样的model
class Order{ private List<OrderItem> orderItems; public List<OrderItem> getOrderItems(){ return this.orderItems; } public List<OrderItem> setOrderItems(List<OrderItem> orderItems){ this.orderItems = orderItems; } }
这样有可能在不知情的情况下外别人把orderItems 里面增或删元素
Order不希望这件事发生,因为会隐含地带来很多出bug的机会
所以它应该把orderItems隐藏起来,最先想到的是去掉 set方法, 但是get之后拿到List还是可以操作的,经过一番搜索,发现有一个这样的方法
Collections.unmodifiableList(list);
这个方法会生成一个新的List并包含原有的list中元素,这个List是只读的,调用添加删除方法都会抛出UnsupportedOperationException
这样我的List终于不怕被人乱改数据了
class Order { private List<OrderItem> orderItems = new ArrayList<OrderItem>(); private double totalPrice; private addTotalPrice(double price) { this.totalPrice += price; } public List<OrderItem> getOrderItems() { return Collections.unmodifiableList(list); } private void addOrderItems(OrderItem orderItem) { this.orderItems.add(orderItem); this.addTotalPrice(orderItem.getPrice()); } }