在Java中为什么私有类成员可以通过公共getter方法直接访问?

时间:2017-09-30 19:12:13

标签: java

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方法访问它并存储它的引用,那么将这个变量设为私有的重点是什么。

那么,避免这种直接访问的最佳做法是什么?

2 个答案:

答案 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");
     }
}