class Person {
private List<String> data = new ArrayList<>();
public List<String> getData(){
return data;
}
}
Class Test {
public static void main(String args[]){
Person person = new Person();
List<String> d = person.getData();
//next two lines directly clears and adds values in the Person class private property
d.clear();
d.add("test");
}
}
这是可能的,因为getter方法返回真实对象的引用。所以如果你可以使用getter方法访问它并存储它的引用,那么将这个变量设为私有的重点是什么。
那么,避免这种直接访问的最佳做法是什么?
答案 0 :(得分:0)
获得getter / setter的美妙之处在于,您可以在返回数据之前对数据执行任何操作。您可以隐藏数据的实际实施,强制执行其他规则
class Person {
private List<String> data = new ArrayList<>();
public List<String> getData(){
// let's return an immutable list. We don't have to change the field variable to immutable because no one can access it directly except for this class.
return Collections.unmodifiableList(data);
}
}
答案 1 :(得分:0)
如果你不想要一个吸气剂,不要创造一个吸气剂。创建安全更改私有成员的方法。在需要之前不需要吸气剂。
使用方法访问属性意味着您可以根据需要进行检查等。
如果您确实想要返回整个数据对象(为了便于使用),但不让调用者编辑它,您可能会返回一个克隆。
注意:克隆无法跟上对原始data
所做的更改。如果你想要,尝试使用建议的不可变列表,或者只是使用方法来获得你想要的东西。
示例:
class Person {
private List<String> data = new ArrayList<>();
public void clearDate () {
data.clear();
}
public void addToDate (String s) {
data.add(s);
}
public List<String> getData () {
return data.clone();
}
}
Class Test {
public static void main(String args[]) {
Person person = new Person();
//next two lines safely clears and adds values in the Person class private property
person.clearData();
person.addToData("test");
}
}