博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重构第一天:封装集合
阅读量:5223 次
发布时间:2019-06-14

本文共 1107 字,大约阅读时间需要 3 分钟。

在一些情况下,在一个类中选择不去暴露整个集合给调用者是非常有必要的。比如当我们给一个集合添加/删除item时,我们需要添加一些额外的逻辑。因为这个原因,一个非常好的办法就是让暴露出来的collecction只能被迭代而不能被修改。让我们看下面的例子。

public class Order{    private List
_orderLines; public IEnumerable
OrderLines { get { return _orderLines; } } public void AddOrderLine(OrderLine orderLine) { _orderTotal += orderLine.Total; _orderLines.Add(orderLine); } public void RemoveOrderLine(OrderLine orderLine) { orderLine = _orderLines.Find(o => o == orderLine); if (orderLine == null) return; _orderTotal -= orderLine.Total _orderLines.Remove(orderLine); }}

       正如你看到的,我们已经已经对collection进行了封装, 因为返回值是IEnumerable,_orderLines不会暴露给外界Add/Remove方法,她只能被迭代检索。采用这种办法可以确保调用者不会滥用你的collection,确保你的代码不会引入bug。

  也许有些人会说,这样做没办法做到让_orderLines绝对的安全,外部调用者还是可以把OrderLines强制转化为List, 然后进行Add/remove操作。你要是非要这么较真,那你可以稍微修改一下,通过下面的方式返回一个copy给调用者。

 

1  public IEnumerable
OrderLines2 {3 get { return new List
(_orderLines); }4 }

转载于:https://www.cnblogs.com/peteryan/p/3805099.html

你可能感兴趣的文章
UITabbarController的UITabbarItem(例:"我的")点击时,判断是否登录
查看>>
UNIX基础知识之输入和输出
查看>>
【洛谷 P1666】 前缀单词 (Trie)
查看>>
数据库锁机制及乐观锁,悲观锁的并发控制
查看>>
图像处理中双线性插值
查看>>
RobHess的SIFT代码解析之RANSAC
查看>>
03 线程池
查看>>
201771010125王瑜《面向对象程序设计(Java)》第十三周学习总结
查看>>
手机验证码执行流程
查看>>
python 基础 ----- 变量
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>
:hover 鼠标同时触发两个元素变化
查看>>
go语言学习十三 - 相等性
查看>>
Idea 提交代码到码云(提交到github也大同小异)
查看>>
c#连接excel2007未安装ISAM解决
查看>>
Mono 异步加载数据更新主线程
查看>>
初识lua
查看>>
我是插件狂人,jDuang,jValidator,jModal,jGallery
查看>>
张季跃 201771010139《面向对象程序设计(java)》第四周学习总结
查看>>