使用getter和setter的私有属性有什么好处?

lou*_*lou 8 c++ java oop

在面向对象的编程中,我曾经有过这个问题而且我仍然这样做:

如果我们将为其创建一个公共getter和一个公共setter,那么将一个类成员声明为私有会有什么好处?

我认为上述案例与将类成员声明为公开的案件之间的安全级别没有任何区别.

谢谢!

Jun*_*san 12

封装提供了数据隐藏和对成员变量的更多控制.如果属性是公共的,那么任何人都可以访问它并可以为其分配任何值.但是,如果您的成员变量是私有的,并且您已为其提供了setter.然后,您始终可以选择在setter方法中设置一些约束,以避免设置不合逻辑的值.

例如,仅包含公共成员的类:

class MyClass {
    public int age;
}

public MyClassUser {

    public static void main(String args[]) {
        MyClass obj = new MyClass();
        obj.age = -5 // not a logical value for age
    }
}
Run Code Online (Sandbox Code Playgroud)

与私有成员和setter相同的类:

 class MyClass {
     private int age;
     public void setAge(int age) {
         if(age < 0) {
            // do not use input value and use default
         } else { 
            this.age = age;
         }
     }
 }
Run Code Online (Sandbox Code Playgroud)


Sim*_*ple 8

如果你的类没有不变量来维护,那么为私有数据成员编写公共getter和setter是没有意义的; 你应该只使用一个公共数据成员.

另一方面,如果您确实有不变量来维护,那么使用setter可以允许您限制可以分配给数据成员的值.

请注意,仅仅因为您拥有数据成员并不意味着您必须为其编写任何getter或setter.

宠儿: "但如果内部变化怎么办?" 没关系.你有一个getName函数返回一个std::string const&.Getters 减少了封装,因为它们会在以后更改实现时限制您的选择.


Pab*_*ano 6

快速(有点傻)的例子:

class Foo {

    private int age = -1;  // unset value

    public setAge(int a) {
        if (a < 0) {
            throw new IllegalArgumentException("Invalid age "+a);
        }
        age = a;
    }

    public getAge() {
       if (age < 0) {
           throw new InvalidStateException("Age was not previously set.")
       }
       return age;
    }    
}
Run Code Online (Sandbox Code Playgroud)

简而言之:您获得了控制权并且可以确保值是正确的。这就是所谓的封装。

  • +1 您一开始可能不会这样做,但稍后可能想添加这样的逻辑,而不必更改使用此类的所有代码。 (3认同)