在Java中,为什么私有类成员可以通过公共getter方法直接访问? 班级人员{ 私有列表数据=新的ArrayList(); 公共列表getData(){ 返回数据; } } 课堂测试{ 公共静态void main(字符串参数[]){ Person=新人(); List d=person.getData(); //接下来的两行直接清除并添加Person类私有属性中的值 d、 清除(); d、 添加(“测试”); } }

在Java中,为什么私有类成员可以通过公共getter方法直接访问? 班级人员{ 私有列表数据=新的ArrayList(); 公共列表getData(){ 返回数据; } } 课堂测试{ 公共静态void main(字符串参数[]){ Person=新人(); List d=person.getData(); //接下来的两行直接清除并添加Person类私有属性中的值 d、 清除(); d、 添加(“测试”); } },java,Java,这是可能的,因为getter方法返回实际对象的引用。那么,如果可以使用getter方法访问该变量并存储其引用,那么将该变量设为私有变量有什么意义呢 那么,避免这种直接访问的最佳实践是什么呢?拥有getter/setter的好处在于,在返回数据之前,您可以对数据执行任何操作。您可以隐藏数据的实际实现,并施加附加规则 class Person { private List<String> data = new ArrayList<>(); public L

这是可能的,因为getter方法返回实际对象的引用。那么,如果可以使用getter方法访问该变量并存储其引用,那么将该变量设为私有变量有什么意义呢


那么,避免这种直接访问的最佳实践是什么呢?

拥有getter/setter的好处在于,在返回数据之前,您可以对数据执行任何操作。您可以隐藏数据的实际实现,并施加附加规则

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");

    }

}
班级人员{
私有列表数据=新的ArrayList();
公共列表getData(){
//让我们返回一个不可变列表。我们不必将字段变量更改为不可变,因为除了这个类之外,没有人可以直接访问它。
返回集合。不可修改列表(数据);
}
}

如果不需要getter,请不要创建getter。创建安全更改私有成员的方法。只有在需要的时候才需要吸气剂

使用方法访问属性意味着您可以在需要时进行检查,等等

如果您确实希望返回整个数据对象(以便于使用),但不允许调用方编辑它,则可以返回克隆。
注意:克隆无法跟上对原始
数据所做的更改。如果你想这样做,试着按照建议使用一个不可变列表,或者简单地使用方法来获得你想要的

例如:

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);
    }

}
班级人员{
私有列表数据=新的ArrayList();
公共无效清除日期(){
data.clear();
}
公共void addToDate(字符串s){
数据。添加;
}
公共列表getData(){
返回data.clone();
}
}
课堂测试{
公共静态void main(字符串参数[]){
Person=新人();
//接下来的两行安全地清除并添加Person类私有属性中的值
person.clearData();
个人添加数据(“测试”);
}
}

“那么,避免这种直接访问的最佳做法是什么?”嗯,不要从getter返回它?您可以返回其上的只读视图,或不可变快照或其他内容。我们不能在不知道您想要实现什么的情况下说。返回
数据的不可变副本。
。就像Jon说的:返回迭代器或副本。返回真实内容会破坏封装。
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");
     }
}