public class Student {
private int id;
private String name;
public Student() {
}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "[" + id + ", " + name + "]";
}
}
Student one = new Student(1, "Tim");
Student two = new Student(2, "Jack");
Map<Integer, Student> map = new HashMap<Integer, Student>();
map.put(one.getId(), one);
map.put(two.getId(), two);
Student tmp = map.get(1);
tmp.setName("New"); // {1=[1, New], 2=[2, Jack]}
可以发现我将Map中的某项取出来并进行了修改,那么Map中的相应项也会被修改,所以说是引用传递的,但是有些情况我就是想把这个东西拿出来用并作些修改,但是Map的数据作为原始值是不想被变更的,这种情况下应该怎么办呢?
高洛峰2017-04-18 09:09:29
java中实现clonable接口 c#实现IClonable接口,实现clone方法。调用该克隆方法得到一个引用与原对象不同但值相同的object。
阿神2017-04-18 09:09:29
两种方法:用工具;自己重写clone方法
Spring BeanUtils
commons-beanutils
BeanCopier
见 CloneDemo.java
@Override
public Student clone(){
Student student = new Student(id, name);
return student;
}
Student one = new Student(1, "Tim");
Student two = new Student(2, "Jack");
Map<Integer, Student> map = new HashMap<Integer, Student>();
map.put(one.getId(), one);
map.put(two.getId(), two);
Student tmp = map.get(1);
Student student2 = tmp.clone();
student2.setName("New");
高洛峰2017-04-18 09:09:29
方法1,新建一个对象,只有get方法,你问题里的Student继承这个对象,有set方法,这样你在Map里放的没有set方法的对象,固然就是不可修改的
方法2,麻烦点啊,监视Student的set方法,如果有调用,马上抛个异常出来,如何监视,这个很容易的。