在没有吸气剂的情况下访问模型 class 的私有变量
Accessing private variable of Model class without getters
我在我的项目中定义了一个模型 class。和往常一样,它有一些私有变量和 public getters 和 setters
public class Person{
private ArrayList<String> mark;
public void setMark(ArrayList<String> mark){
this.mark = mark;
}
public void getMark(){
return this.mark;
}
}
假设在其他一些 class 我正在使用这个模型
Person person = new Person();
ArrayList<String> mark = new ArrayList();
mark.add("10");
mark.add("15");
mark.add("18");
person.setMark();
然后 person 的私有变量保存值 "my name",我正在使用 class 的 public getter 访问该变量,例如
ArrayList<String> localMark = person.getMark()
所以据我所知person.getMark() returns私有变量名的引用,所以如果我修改局部变量'localMark',那么它会影响私有变量Person class,所以它破坏了 variable
的 private 属性
例如:
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...它 returns 引用。
您有一个对象实例(名称的值)的引用(名称)。由于引用是私有的,因此您可以完全控制它。
当你return一个引用,你实际上return它'by value',这意味着 引用 的副本是 returned。两个引用都指向相同的值(String 实例))。
获取引用的外部调用者可以分配一个新值,但您的模型自己的引用不受此影响,仍然指向该值。
就像一只狗(物体)被牵着(参考)。
- 当您 return 引用时,您 return 将一条新的皮带拴在同一只狗身上。
- 当狗是可变的(字符串不是,所以不能修改)时,新引用的所有者可以修改您的狗(抚摸它、给它剃毛,等等)
- ...或者他可以在他的皮带上拴一条新狗
- ...但他永远无法(抛开反思)将您的浸出物附加到另一只狗身上。
如果通过调用 get()
公开的实例是 可变的 ,那么您在其他地方所做的任何更改都将反映在使用它的任何地方的实例中.
示例:
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.
如果您不想让外部玩家更改原始实例(前提是您不能使实例本身 不可变)
我在我的项目中定义了一个模型 class。和往常一样,它有一些私有变量和 public getters 和 setters
public class Person{
private ArrayList<String> mark;
public void setMark(ArrayList<String> mark){
this.mark = mark;
}
public void getMark(){
return this.mark;
}
}
假设在其他一些 class 我正在使用这个模型
Person person = new Person();
ArrayList<String> mark = new ArrayList();
mark.add("10");
mark.add("15");
mark.add("18");
person.setMark();
然后 person 的私有变量保存值 "my name",我正在使用 class 的 public getter 访问该变量,例如
ArrayList<String> localMark = person.getMark()
所以据我所知person.getMark() returns私有变量名的引用,所以如果我修改局部变量'localMark',那么它会影响私有变量Person class,所以它破坏了 variable
的 private 属性例如:
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...它 returns 引用。
您有一个对象实例(名称的值)的引用(名称)。由于引用是私有的,因此您可以完全控制它。
当你return一个引用,你实际上return它'by value',这意味着 引用 的副本是 returned。两个引用都指向相同的值(String 实例))。
获取引用的外部调用者可以分配一个新值,但您的模型自己的引用不受此影响,仍然指向该值。
就像一只狗(物体)被牵着(参考)。
- 当您 return 引用时,您 return 将一条新的皮带拴在同一只狗身上。
- 当狗是可变的(字符串不是,所以不能修改)时,新引用的所有者可以修改您的狗(抚摸它、给它剃毛,等等)
- ...或者他可以在他的皮带上拴一条新狗
- ...但他永远无法(抛开反思)将您的浸出物附加到另一只狗身上。
如果通过调用 get()
公开的实例是 可变的 ,那么您在其他地方所做的任何更改都将反映在使用它的任何地方的实例中.
示例:
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.
如果您不想让外部玩家更改原始实例(前提是您不能使实例本身 不可变)