注意对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());
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值