论坛首页 Java版 OO

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

浏览 2665 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-08-09
zzysh 写道
litchi,你提供的代码不能通过编译。似乎list不能直接调用clone方法吧。另外,就算得到一个clone的对象后,这个clone的对象就是只读的吗?


问题1.
list.clone报错,因为list是个接口,继承于collection接口,并不继承于Object类,其具体实现(比如ArrayList等),才继承于Object,而clone方法是在Object中定义的
刚才我写的时候没有注意到这个问题,你可以这么写,有点别扭
Arrays.asList((Object[])al.toArray().clone());


问题2
这个clone的对象和你原来的对象是没有dependence的,所以即使用户修改了这个list,也不会影响你原来的list,
   
0 请登录后投票
最后更新时间:2007-08-09
litchi 写道
zzysh 写道
litchi,你提供的代码不能通过编译。似乎list不能直接调用clone方法吧。另外,就算得到一个clone的对象后,这个clone的对象就是只读的吗?


问题1.
list.clone报错,因为list是个接口,继承于collection接口,并不继承于Object类,其具体实现(比如ArrayList等),才继承于Object,而clone方法是在Object中定义的
刚才我写的时候没有注意到这个问题,你可以这么写,有点别扭
Arrays.asList((Object[])al.toArray().clone());


问题2
这个clone的对象和你原来的对象是没有dependence的,所以即使用户修改了这个list,也不会影响你原来的list,


谢谢你的解释,对于clone,我用的list是ArrayList啊,按照你说的原理,应该是有clone方法的。我用的是
private List list = new ArrayList();


所以还是不是很清楚为什么不能用clone()方法

另外,你可能还是没有明白我的意思,我的目的不是让使用者不修改原来的list,我的目的是让使用者得到一个只读的list,他只能使用我里面已经加号的元素,不能用add方法或者其他方法修改里面的内容。所以我觉得clone方法解决不了我的问题。
   
0 请登录后投票
最后更新时间:2007-08-09
哦。第一个问题我知道了。不能用list来声明变量。必须用ArrayList来声明一个变量。引用变量的类型决定了那些方法可以调用。因为引用变量的类型是list,就像litchi所说,是一个接口。所以没有clone方法。这回彻底明白了。
   
0 请登录后投票
最后更新时间:2007-08-09
可以写个List1继承ArrayList,重写add方法。
class List1<E> extends ArrayList
{
 
public boolean add(Object o) {
if(super.size()<1)//大小为1
  {
  super.add(o);
 
  }
  else
  {
 
  System.out.println("不允许再加入了");
  }
return true;
}
}

class TestList   
{  
    private List<String> list =  new List1<String>();  
    public TestList()  
    {  
        list.add("String");  
    }  
 
    public List getList(){  
        return list;
    }  
   
}
   
0 请登录后投票
最后更新时间:2007-08-09
sinosoft15 写道
可以写个List1继承ArrayList,重写add方法。
class List1<E> extends ArrayList
{
 
public boolean add(Object o) {
if(super.size()<1)//大小为1
  {
  super.add(o);
 
  }
  else
  {
 
  System.out.println("不允许再加入了");
  }
return true;
}
}

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


恩。这也是个不错的解决方案。谢谢!
   
0 请登录后投票
最后更新时间:2007-08-09
传出来时iterator()
那东西是不能改内容的。
   
0 请登录后投票
最后更新时间:2007-08-09
zzysh 写道
哦。第一个问题我知道了。不能用list来声明变量。必须用ArrayList来声明一个变量。引用变量的类型决定了那些方法可以调用。因为引用变量的类型是list,就像litchi所说,是一个接口。所以没有clone方法。这回彻底明白了。

是这样的,但是这样就违背了你面对List接口编程的初衷,转而使用ArrayList这个具体实现了,这并不是一个好的方向
   
0 请登录后投票
论坛首页 Java版 OO

跳转论坛:
JavaEye推荐