- 浏览: 151313 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (87)
- seam/jsf (22)
- java (24)
- spring (6)
- hibernate (2)
- Mysql (4)
- web (1)
- JMS (0)
- 计算机(computer) (1)
- linux (3)
- eclipse (4)
- Javascript (1)
- xstream (3)
- JPA (2)
- 汇编 (1)
- HttpClient (1)
- quartz (1)
- J2EE (2)
- EJB (1)
- restful web (1)
- maven (1)
- TTServer (3)
- restlet (0)
- jquery (0)
- Firebug (0)
- jquery Masonry+Infinite-Scroll (0)
- JACOB (0)
- elasticsearch (0)
最新评论
-
tuspark:
关于ApplicationContextAware的详细介绍, ...
ApplicationContextAware -
hc_face:
应该是 环境被初始化的时候,bean 也一并被初始化吧。先后顺 ...
ApplicationContextAware -
奇林醉:
有点明白了
Collections.unmodifiableList() -
tcking:
HashSet不关心迭代的次序,也就是说下一次的迭代次序可能就 ...
HashSet LinkedHashSet TreeSet -
yzhw:
我要去试试
seam前端提速
在《重构——改善既有代码的设计》一书中,有一种重构手法叫Encapsulate Collection
(封装集群),为了演示该重构手法,我写了四个类,通过对比重构前后的代码,加深对
这一重构手法的理解。
类Student有一ArrayList属性,如果没有阅读《重构——改善既有代码的设计》一书,
很多人可能会像我一样,如下设计类Student。但是,如果通过Student.getCourses()
获得对ArrayList属性引用后,就可以任意为Student对象添加“课程”,而Student对象
对此一无所知,这不符合面向对象编程的习惯。
package com.readonlylist;
import java.util.ArrayList;
public class Student
{
private String name;
private ArrayList<String> courses;
public Student(String name, ArrayList<String> courses)
{
this.name = name;
this.courses = courses;
}
public ArrayList<String> getCourses()
{
return courses;
}
public void setCourses(ArrayList<String> courses)
{
this.courses = courses;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
package com.readonlylist;
import java.util.ArrayList;
public class Test
{
public static void main(String[] args)
{
ArrayList<String> list = new ArrayList<String>();
list.add("001");
list.add("002");
Student s = new Student("Tom", list);
ArrayList<String> anotherList = s.getCourses();
anotherList.add("999");
System.out.println("Tom's course.length = " + s.getCourses().size());
}
}
重构后的Student类如下所示:
package com.readonlylist;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Student1
{
private String name;
private ArrayList<String> courses;
public Student1(String name, ArrayList<String> courses)
{
this.name = name;
this.courses = courses;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public void addCourse(String course)
{
courses.add(course);
}
public String removeCourse(String course)
{
boolean removed = courses.remove(courses);
if (removed)
{
return course;
}
else
{
return null;
}
}
public List<String> getCourses()
{
return Collections.unmodifiableList(courses);
}
}
package com.readonlylist;
import java.util.List;
import java.util.ArrayList;
public class Test1
{
public static void main(String[] args)
{
ArrayList<String> list = new ArrayList<String>();
list.add("001");
list.add("002");
Student1 s = new Student1("Tom", list);
List<String> anotherList = s.getCourses();
/**
* throws java.lang.UnsupportedOperationException
* should replace with s.addCourse(String course)
*/
anotherList.add("999");
// never reached
System.out.println("Tom's course.length = " + s.getCourses().size());
}
}
重构后,Student1类,仅对外提供的getCourses()方法,而没有setCourses()方法,而且
通过getCourses()方法获得的courses是“只读的”,如果你试图向其添加一个新课程,则
抛出java.lang.UnsupportedOperationException。你必须通过Student1.addCourse()来
向特定的Student1对象添加一个新课程。就好像,你必须让顾客自己向购物车里放食物,
而不能在顾客毫不知情下,偷偷向其购物车里放食物。
真是万物皆通情理啊:)
from:http://hi.baidu.com/onejava/blog/item/10388f2b77d340fae6cd4091.html
发表评论
-
在线安装jdk
2014-08-12 16:55 0yum -y list java* yum -y insta ... -
java敏感字
2013-04-07 16:25 0public class KeywordFilter { ... -
java
2012-11-27 15:13 0http://smallbee.iteye.com/blog/ ... -
Top 10
2012-08-17 17:41 0很多程序员响应,他们在推荐时也写下自己的评语。 以前就有国内网 ... -
数字签名
2011-12-02 10:45 0今天,我读到一篇好文章。 它用图片通俗易懂 ... -
jmock
2011-10-17 14:54 1200java.lang.IllegalArgumentExcept ... -
正则口诀
2011-05-03 22:29 1206正则是每个程序员绕不开的堡垒,只有把它攻下来。我觉得 ... -
Ear、Jar、War文件之间
2011-03-23 22:37 1203在文件结构上,三者并没有什么不同,它们都采用zip或jar档案 ... -
Cannot create a generic array of T
2011-03-17 18:08 1957public static <T> T[] cre ... -
Java 位运算符
2011-03-09 22:48 994Java 定义的位运算(bitwise operators ) ... -
虚拟机中linux安装jdk
2011-01-15 17:38 2900主机:xp 虚拟机:VMware Workstation 7 ... -
tcdatabase-2
2010-11-03 22:33 938搜索操作:根据“字段 ... -
tcdatabase
2010-11-03 22:32 1087为何写tcdatabase tcdataba ... -
java字节码
2010-10-11 07:13 1004这一两年,在JVM上使用 ... -
Comparator和Comparable在排序中的应用
2010-09-17 15:49 900Comparator和Comparable在排序中的应用 当 ... -
浅复制与深复制
2010-09-17 15:19 8391.浅复制与深复制概念 ... -
apache.commons.beanutils.BeanUtils
2010-09-03 10:11 1473该class提供了一系列的静态方法操作业已存在的符合JavaB ... -
java学习之路
2010-08-26 13:45 823励志一下 http://forchenyun.iteye.co ... -
black 星期四
2010-08-19 11:08 805black 星期四~~~~~~~~~~~~~~~~~~ -
java.lang.io包 Serializable
2010-07-22 10:45 1362序列化是什么:序列化就是将一个对象的状态(各个属性量)保存 ...
相关推荐
例如,`Collections.unmodifiableList()`, `Collections.unmodifiableSet()`, 和 `Collections.unmodifiableMap()`分别用于创建只读列表、只读集合和只读映射。这些方法返回的集合在尝试进行添加、删除或替换元素...
* `Collections.unmodifiableList(List<? extends T> list)`: 返回一个不可变的列表。 示例代码 下面是一个使用 Collections 中部分方法的示例代码: ```java import java.util.ArrayList; import java.util....
List integers = Collections.unmodifiableList(list); integers.add(4); System.out.println(integers); 执行结果: UnsupportedOperationException 通过这些“轮子”,我们可以极大地提升我们的开发效率,提高...
- `Collections.unmodifiableList(List l)`: 将列表`l`包装为只读列表。 - `Collections.unmodifiableMap(Map m)`: 将映射`m`包装为只读映射。 - `Collections.unmodifiableSet(Set s)`: 将集合`s`包装为只读集合。 ...
3. 包装器实现:如Collections工具类提供的不可变版本(如Collections.unmodifiableList()),以及同步集合(如Collections.synchronizedList())。 4. 抽象实现:如AbstractList、AbstractSet和AbstractMap,提供...
List<String> unmodifiableList = CollectionUtils.unmodifiableList(new ArrayList()); // 使用过滤迭代器只保留偶数 List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); Iterator<Integer> evenNumbers = ...
题目中展示了`Collections.unmodifiableList()`方法的使用,该方法返回一个只读视图,即一个不可变的列表。当尝试修改这个不可变列表时,会抛出`UnsupportedOperationException`异常,这在题目的第一部分得到了体现...
除了以上五点,还有一些实用的工具类,如`Collections.synchronizedList()`用于同步列表,`Collections.unmodifiableList()`创建只读列表,以及`Collections.reverse()`用于反转列表等。了解并善用这些特性,可以...
1. **集合增强**: Commons Collections提供了一系列接口和类,如`TransformedList`和`UnmodifiableList`,它们分别用于在操作列表时进行动态转换和防止修改。这些工具类可以帮助我们构建更安全、更具定制性的集合。...
但是,如果集合是不可变的,如`Collections.unmodifiableList()`返回的列表,尝试反转会抛出`UnsupportedOperationException`。 7. **扩展应用**: 反转操作在多种场景下都很有用,如实现堆栈(LIFO,后进先出)的...
1. 使用 JDK 内置的 `Collections.unmodifiableList()` 方法:这个方法可以将任何现有的 List 转换成不可修改的视图。例如,创建一个包含三个元素的列表,然后尝试添加元素会导致 `UnsupportedOperationException`。...
List<String> unmodifiableList = Collections.unmodifiableList(new ArrayList()); // 在多线程环境中使用这些集合进行操作... } } ``` 理解并熟练运用这些线程安全集合是构建健壮、高性能的多线程Java应用...
- **不可变集合**:通过`Collections.unmodifiableList()`等方法可以创建不可变集合,确保集合内容不会被意外修改。 - **泛型类型安全性**:自Java 5起,通过泛型机制增强了类型安全性,但需要注意避免在运行时发生...
比如,通过使用`FastList`和`UnmodifiableList`等定制的集合实现,来替代标准的`ArrayList`和`Collections.unmodifiableList()`,在某些场景下能显著提升性能。 3. **并发支持**: 在并发编程中,GS Collections...
传统的不可变集合通常是通过 `Collections.unmodifiableList()` 或类似方法创建的代理对象,这种对象只提供了一层简单的包装,实际上集合本身仍然是可变的。而 Guava 提供的 `ImmutableCollections` 真正实现了不可...
9. 集合框架的不可变性:`Collections.unmodifiableList()`、`Collections.unmodifiableSet()`和`Collections.unmodifiableMap()`等方法创建只读视图,防止修改原始集合。 10. 泛型与类型安全:理解泛型的概念,...
4. **使用`Collections.unmodifiable*`**:对于集合类,可以返回`Collections.unmodifiableList()`、`Collections.unmodifiableSet()`等包装后的集合,防止外部修改。 5. **使用`final`关键字**:如果内部表示是...
- 使用Collections.unmodifiableList()等方法将可变集合转换为不可变集合。 15. **自定义迭代器** - 实现Iterator接口,重写hasNext()和next()方法,管理迭代状态和索引。 通过理解这些核心概念和差异,你将能够...
12. **不可变集合**:`Collections.unmodifiableList()`、`Collections.unmodifiableSet()`和`Collections.unmodifiableMap()`等方法创建不可变集合,防止集合内容被修改,提高代码安全性。 13. **枚举Set**:`...