今天看NFS-RPC的源码,看到有这样的代码:Collections.unmodifiableList(servers);突然想起来自己之前看重构时的一种叫Encapsulate Collection的思想,今天以代码为主线再来回顾下:

1 public class Company {
2  
3     private String companyName;//the name of company
4     private List<String> clerkList;//the clerk list
5      
6     //companyName,clearList getter and setter method
7     ........
8 }

我们封装了一个公司类,公司类中包含一个公司名和公司员工的属性,其中公司员工使用List存放。看似完美,然后我们在其他地方使用Company这个类:

1 Company company = new Company();
2 List<String> list = company.getClerkList();
3 list.add("guolei");

有没有发现什么怪异的地方?在我们获得list的引用后,可以直接操作list,而无需通过company对象。在面向对象的角度来看,这是不正确的设计思想。同样这样的代码看起来也不优雅。这个时候我们引出Collections.unmodifiableList()方法,这个方法的作用是:

1 Returns an unmodifiable view of the specified collection.

也就是返回一个集合,这个集合就像我们数据库的视图一样,只能read,而不能write。

好了,现在我开始改编我的那个不太优雅的Company类:

view sourceprint?
01 public class Company {
02  
03     private String companyName;//the name of company
04     private List<String> clerkList = new ArrayList<String>();//the clerk list
05      
06     public void setCompanyName(String companyName) {
07         this.companyName = companyName;
08     }
09     /**
10      * return a view of clerkList
11      * <a href="http://my.oschina.net/u/556800" class="referer" target="_blank">@return</a>  clerk list
12      */
13     public List<String> getClerkList() {
14         return Collections.unmodifiableList(clerkList);
15     }
16     /**
17      * add a clerk
18      * @param clerkName
19      */
20     public void addClerk(String clerkName){
21         clerkList.add(clerkName);
22     }
23     /**
24      * remove the clerk
25      * @param clerkName
26      */
27     public void removeClerk(String clerkName){
28         clerkList.remove(clerkName);
29     }
30 }

利用Collections的视图方法后,代码变的更加优美,更加健壮。

转载于:https://www.cnblogs.com/chenying99/archive/2012/11/01/2750500.html

Refactoring: Encapsulate Collection相关推荐

  1. Encapsulate Collection(封装集合)

    函数直接返回了一个集合 public class Person {private Set<Course> courses;public Set<Course> getCours ...

  2. 敏捷开发 宣言 思想 认识误区

    敏捷软件开发 Agile software Development 敏捷开发是一种软件开发方法,基于迭代和增量开发,通过自组织,跨团队,沟通协作完成开发工作. 敏捷宣言的诞生: 2001年2月11日到 ...

  3. 重构:改善既有代码的设计(软件开发的不朽经典)

    重构:改善既有代码的设计(软件开发的不朽经典) 基本信息 作者: (美)Martin Fowler   译者: 熊节[同译者作品] 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:978 ...

  4. #圈复杂度 - Cyclomatic Complexity

    ##概念 循环复杂度(Cyclomatic complexity)也称为条件复杂度,是一种软件度量,是由老托马斯·J·麦凯布(英语:Thomas J. McCabe, Sr.) 在1976年提出,用来 ...

  5. 表达式必须是可修改的左值怎么解决_如何解决代码腐败的味道

    一. Duplicated Code(重复代码) 如果你在一个以上的地点看到相同的程序结构,设法将他们合而为一,程序会变得更好. 同一个类的两个函数含有相同的表达式,采用Extract Method( ...

  6. 25种代码坏味道总结+优化示例

    前言 什么样的代码是好代码呢?好的代码应该命名规范.可读性强.扩展性强.健壮性......而不好的代码又有哪些典型特征呢?这25种代码坏味道大家要注意啦 1. Duplicated Code (重复代 ...

  7. 改善代码设计 —— 组织好你的数“.NET研究”据(Composing Data)

    系列博客 1. 改善代码设计 -- 优化函数的构成(Composing Methods) 2. 改善代码设计 -- 优化物件之间的特性(Moving Features Between Objects) ...

  8. 重构-改善既有代码的设计读书笔记

    1.基本重构 1.1 提炼函数(Extract Function) 将意图和实现分开,如果需要花时间浏览一段代码才能弄清它到底在干什么,那么就应该将其提炼到一个函数中,并根据它所做的事为其命名. 1. ...

  9. 《重构,改善既有代码的设计》读书笔记

    重构,绝对是写程序过程中最重要的事之一.在写程序之前我们不可能事先了解所有的需求,设计肯定会有考虑不周的地方,而且随着项目需求的修改,也有可能原来的设计已经被改得面目全非了.更何况,我们很少有机会从头 ...

  10. Collections.unmodifiableMap

    1. Collections.unmodifiableMap 是什么? Java的官方解释: public static <K,V> Map<K,V> unmodifiable ...

最新文章

  1. TensorFlow学习笔记(一):数据操作指南
  2. python-常用函数模块学习-subprocess
  3. Python基础知识(第六天)
  4. 解除ABAP程序编辑锁的方法
  5. php mvc cms企业站,Phpcms V9程序目录结构及MVC简析
  6. Asp.net2.0 学习资源(转载)
  7. html代码style图片width,HTML Style columnWidth用法及代码示例
  8. eclipse--基本配置
  9. GPU Raycasting的两种实现方法
  10. Flask和WebSocket
  11. 200中国姓氏日语发音
  12. 输出滑动窗口最大值(双端队列)
  13. 每个Linux 用户都应该知道的Linux技巧
  14. 计算机的ps快捷键,PHOTOSHOP常用快捷键大全
  15. RepVGG: Making VGG-style ConvNets Great Again
  16. PyPDF2读取PDF文件内容保存到本地TXT
  17. commander.js之option、command、version
  18. GC是什么?为什么要有GC
  19. 7年测试工程师,裸辞掉17K的工作,想跳槽找更好的,还是太高估自己了....
  20. static struct、typedef struct

热门文章

  1. Exchange 2016 CU3 安装失败解决方法
  2. 从HDFS看分布式文件系统的设计需求
  3. discuz 任务扩展
  4. Devexpress使用记录
  5. 汉中市驾驶员理论模拟考试题
  6. Luogu3941[湖南集训2017] 入阵曲
  7. Express框架学习笔记-express路由参数
  8. python优点和特点-Python的优点和缺点有哪些?Python语言的特点
  9. 基于python 爬虫_基于python的爬虫(一)
  10. 如何在手机上编码python_如何在Python中进行热编码?