我的项目中定义了一个Model类。像往常一样,它有一些私有变量和公共getter和setter
public class Person{
private ArrayList<String> mark;
public void setMark(ArrayList<String> mark){
this.mark = mark;
}
public void getMark(){
return this.mark;
}
}
假设在其他一些课程中,我正在使用此模型,如
Person person = new Person();
ArrayList<String> mark = new ArrayList();
mark.add("10");
mark.add("15");
mark.add("18");
person.setMark();
然后person的私有变量持有值“my name”,我正在使用类的公共getter访问变量,如
ArrayList<String> localMark = person.getMark()
据我所知person.getMark()返回私有变量名的引用,所以如果我修改局部变量'localMark',那么它将影响Person类的私有变量,所以它打破了私有属性变量
前:
ArrayList<String> localMark = person.getMark();
System.out.println(localMark.get(0)); // will be "10"
localMark.set(0,"25") // person.mark will be changed
System.out.println(person.getMark().get(0)); //will be printing "25"
大多数开发人员都遵循相同的设计模式,但是创建Models
的正确方法是什么
修改
根据我检查的vinod的注释,和字符串它传递值但不是引用但是对于ArrayList ...它返回引用。
答案 0 :(得分:2)
您有一个对象实例的引用(名称)(name的值)。由于参考是私人的,你完全可以控制它。
当您返回引用时,实际上返回它'按值',这意味着返回引用的副本。两个引用都指向相同的值(String实例)。
获取引用的外部调用者可以指定一个新值,但您的模型自己的引用不受此影响,仍然指向该值。
它就像皮带上的狗(物体)(参考)。
答案 1 :(得分:1)
如果通过调用get()
公开的实例是 mutable ,那么您在其他地方所做的任何更改都将反映在实例的任何位置。
示例:
methodX classA -
List<String> locaNamesList = person.getNamesList();
locaNamesList.clear();
Somewhere else
methodY classB -
List<String> locaNamesList = person.getNamesList(); // note the same person instance should be used.
//locaNamesList will be empty here
只需重新分配引用即可“改变任何内容。”
List<String> locaNamesList = person.getNamesList();
locaNamesList = null; // won't change the actual list. You are setting local field locaNamesList to null and not the actual instance.
如果您不希望外部播放器更改原始实例,则必须使用可变实例的防御副本并传递它们(前提是您无法自己创建实例< EM>不可变)