Refactoring: Encapsulate Collection
今天看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类:
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相关推荐
- Encapsulate Collection(封装集合)
函数直接返回了一个集合 public class Person {private Set<Course> courses;public Set<Course> getCours ...
- 敏捷开发 宣言 思想 认识误区
敏捷软件开发 Agile software Development 敏捷开发是一种软件开发方法,基于迭代和增量开发,通过自组织,跨团队,沟通协作完成开发工作. 敏捷宣言的诞生: 2001年2月11日到 ...
- 重构:改善既有代码的设计(软件开发的不朽经典)
重构:改善既有代码的设计(软件开发的不朽经典) 基本信息 作者: (美)Martin Fowler 译者: 熊节[同译者作品] 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:978 ...
- #圈复杂度 - Cyclomatic Complexity
##概念 循环复杂度(Cyclomatic complexity)也称为条件复杂度,是一种软件度量,是由老托马斯·J·麦凯布(英语:Thomas J. McCabe, Sr.) 在1976年提出,用来 ...
- 表达式必须是可修改的左值怎么解决_如何解决代码腐败的味道
一. Duplicated Code(重复代码) 如果你在一个以上的地点看到相同的程序结构,设法将他们合而为一,程序会变得更好. 同一个类的两个函数含有相同的表达式,采用Extract Method( ...
- 25种代码坏味道总结+优化示例
前言 什么样的代码是好代码呢?好的代码应该命名规范.可读性强.扩展性强.健壮性......而不好的代码又有哪些典型特征呢?这25种代码坏味道大家要注意啦 1. Duplicated Code (重复代 ...
- 改善代码设计 —— 组织好你的数“.NET研究”据(Composing Data)
系列博客 1. 改善代码设计 -- 优化函数的构成(Composing Methods) 2. 改善代码设计 -- 优化物件之间的特性(Moving Features Between Objects) ...
- 重构-改善既有代码的设计读书笔记
1.基本重构 1.1 提炼函数(Extract Function) 将意图和实现分开,如果需要花时间浏览一段代码才能弄清它到底在干什么,那么就应该将其提炼到一个函数中,并根据它所做的事为其命名. 1. ...
- 《重构,改善既有代码的设计》读书笔记
重构,绝对是写程序过程中最重要的事之一.在写程序之前我们不可能事先了解所有的需求,设计肯定会有考虑不周的地方,而且随着项目需求的修改,也有可能原来的设计已经被改得面目全非了.更何况,我们很少有机会从头 ...
- Collections.unmodifiableMap
1. Collections.unmodifiableMap 是什么? Java的官方解释: public static <K,V> Map<K,V> unmodifiable ...
最新文章
- TensorFlow学习笔记(一):数据操作指南
- python-常用函数模块学习-subprocess
- Python基础知识(第六天)
- 解除ABAP程序编辑锁的方法
- php mvc cms企业站,Phpcms V9程序目录结构及MVC简析
- Asp.net2.0 学习资源(转载)
- html代码style图片width,HTML Style columnWidth用法及代码示例
- eclipse--基本配置
- GPU Raycasting的两种实现方法
- Flask和WebSocket
- 200中国姓氏日语发音
- 输出滑动窗口最大值(双端队列)
- 每个Linux 用户都应该知道的Linux技巧
- 计算机的ps快捷键,PHOTOSHOP常用快捷键大全
- RepVGG: Making VGG-style ConvNets Great Again
- PyPDF2读取PDF文件内容保存到本地TXT
- commander.js之option、command、version
- GC是什么?为什么要有GC
- 7年测试工程师,裸辞掉17K的工作,想跳槽找更好的,还是太高估自己了....
- static struct、typedef struct