访问Model类的私有变量而不使用getter

时间:2015-11-27 09:51:55

标签: java model private getter-setter

我的项目中定义了一个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 ...它返回引用。

2 个答案:

答案 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>不可变)