注意对Collection对象的封装

上一篇博客说到 面向对象的封装特性,只对外暴露该暴露的方法和属性

但是对于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());
	}
}



你可能感兴趣的:(注意对Collection对象的封装)