【发布时间】:2015-11-27 09:51:54
【问题描述】:
我的项目中定义了一个模型类。和往常一样,它有一些私有变量和公共 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的私有变量保存值“我的名字”,我正在使用类的公共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...它返回引用。
【问题讨论】:
-
System.out.println(person.getName()); //将打印“新名称” ==> 你检查了吗?我认为您应该检查打印的内容:)
-
如何修改localName?不变性呢?
-
我没有,但如果它返回引用,它应该是值不是吗?
-
我对你的问题投了反对票,因为你发布了一些不会发生在字符串上的东西。 重新分配引用不会改变任何事情,因为 java 是 pass-by-value。接下来,如果您的 getter 返回了 mutable 实例,您对不同类中的实例所做的更改将影响实际实例(您不应该这样做,您应该返回可变实例的防御性副本)
-
@sᴜʀᴇsʜᴀᴛᴛᴀ - 但他应该在发布之前尝试他的代码。 :)。你不认为我的评论给了他足够的信息/提示吗? :)
标签: java model private getter-setter