论坛首页 Java版 OO

如何确保集合类里面的内容不被子类或者引用类改变?

浏览 2665 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-08-09 关键字: core java
例如,我有下面这个类:
import java.util.ArrayList;
import java.util.List;

class TestList 
{
	private List<String> list = new ArrayList<String>();
	public TestList()
	{
		list.add("String");
	}

	public List getList(){
		return list;
	}
}


怎样确保引用我这个类的类调用getList方法后,不能更改得到的list里面的值。比如不能通过list.add("new string")来添加新的值进去?

谢谢!
   
最后更新时间:2007-08-09
就是说如何定义这个list,确保引用它的人,只能使用我初始化时定义好的内容,不能改变其中的内容。
   
0 请登录后投票
最后更新时间:2007-08-09
java.util.Collections.unmodifiableCollection()
   
0 请登录后投票
最后更新时间:2007-08-09
方法既简单又麻烦:不提供getList接口提供对象引用,只提封装过的接口如addObjectToList...
这样可以保证接口使用者只使用你提供的功能,麻烦的地方是如果要提供的接口很多要写很多代码
   
0 请登录后投票
最后更新时间:2007-08-09
实现一个list,用你得到的那个list来包装
   
0 请登录后投票
最后更新时间:2007-08-09
谢谢各位的回复。
hunk,能否举一个使用java.util.Collections.unmodifiableCollection()的例子,以前没有用过这个方法。谢谢。

mvmouse,我不太明白你的意思,或者你没有理解我的意思。我是需要引用者得到我这个list的。但是他只能使用里面现有的值,而不可以改变其中的值。

liquidthinker,自己封装一个list好像太麻烦了吧。
   
0 请登录后投票
最后更新时间:2007-08-09
试一试这个
#     public List getList(){ 
#         return java.util.Collections.unmodifiableList(list); 
#     }
   
0 请登录后投票
最后更新时间:2007-08-09
zzysh 写道
谢谢各位的回复。
hunk,能否举一个使用java.util.Collections.unmodifiableCollection()的例子,以前没有用过这个方法。谢谢。

mvmouse,我不太明白你的意思,或者你没有理解我的意思。我是需要引用者得到我这个list的。但是他只能使用里面现有的值,而不可以改变其中的值。

liquidthinker,自己封装一个list好像太麻烦了吧。



如果不想封装,返回的时候返回一个list的clone给调用者吧
     public List getList(){  
         return list.clone();  
     }  
   
0 请登录后投票
最后更新时间:2007-08-09
hunk,你的思路是可以。不过代码那样写不能通过编译。需要改一下。不过这个思路是可行的。如果客户端试图使用add方法更改这个Collection里面的值,会抛出UnsupportedOperationException异常

对于List应该使用unmodifiableList方法来返回只读的List视图。
   
0 请登录后投票
最后更新时间:2007-08-09
litchi,你提供的代码不能通过编译。似乎list不能直接调用clone方法吧。另外,就算得到一个clone的对象后,这个clone的对象就是只读的吗?
   
0 请登录后投票
论坛首页 Java版 OO

跳转论坛:
JavaEye推荐