最近编写一个类是把数据库的数据拉取到内存,然后用单利去获取数据。
在使用过程中发现缓存的值被改变了。
查看了获取缓存的方法,是拷贝一个集合返回。
查看了下这个集合clone方法,原来只是简单的把引用拷贝.
如果对集合的对象里面的值进行设置值还是会改变原来的缓存。
最后2解决方案,
1.创建一个新的集合每一个元素都拷贝一次添加到新的集合。
2.创建一个自己的list,这个list改写clone方法,深度拷贝
java的clone方法也非常有局限性,可以考虑使用序列化
public static void main(String[] args) throws Exception {
TestVo vo = new TestVo("11");
ArrayList l = new ArrayList();
l.add(vo);
System.out.println(l);
ArrayList l2 = (ArrayList) l.clone();
l2.get(0).deepClone().name = "22";
System.out.println(l);
}
public static class TestVo implements Serializable {
public String name;
public TestVo(String name){
super();
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "TestVo [name=" + name + "]";
}
public TestVo deepClone() throws Exception {
// 将对象写到流里
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
// 从流里读出来
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (TestVo) (oi.readObject());
}
}