【问题标题】:how to use getter and setter for Encapsulation [duplicate]如何使用getter和setter进行封装[重复]
【发布时间】:2016-09-02 06:21:00
【问题描述】:

我对 getter 和 setter 如何提供封装感到困惑。我的意思是直接给变量赋值和通过getter和setter赋值有什么区别。还可以说我们有两个类 A 和 B。在使用 getter 和 setter 从类 B 中设置值时,我们必须在类 B 中创建类 A 的对象,那么当我们已经知道它们在哪个类中时,如何封装变量已定义。

【问题讨论】:

    标签: java encapsulation getter-setter


    【解决方案1】:

    使用 setter,我们可以对指定的值应用额外的验证,当您将值直接分配给属性时,这是不可能的。一个例子可以是检查值是否不为空,例如:

    public void setVariable(Object value) {
        if (value == null) {
            throw new IllegalArgumentException();
        } else {
            ...
        }
    }
    

    您使用 setter 获得的其他可能性是您可以应用额外的计算。例如,如果您有一个 BankAccount 实例并且您更改了利息,那么设置器可以重新计算必须支付给用户的利息。

    您通过应用 getter 获得的一种可能性是,您可以返回默认值,以防该值尚未设置。

    getter 和 setter 的另一个应用是限制对变量的访问。例如,我们可以在 setter 受到保护时将 getter 公开。这意味着每个人都可以读取该属性,但只有扩展其他类或位于同一包中的类才能设置该值。

    关于你的第二个问题。我不完全理解这个问题。你能详细说明一下吗?

    【讨论】:

    • 感谢您的回答。正如所问的,我的第二个问题是我们已经知道 setter 和 getter 用于封装。但是,如果我们要实现这种封装,我们必须隐藏所有必要的细节。假设我们想从 B 类中更改在 A 类中定义的变量的值。所以 B 类应该除了 setter 和 getter 之外什么都没有,这样没人知道值是在哪个类或哪个变量中设置的。但是这样做的方式是我们必须在 B 中创建一个 A 类的对象,通过它已经知道该变量是在哪个类中定义的。
    • 所以我的问题是,当我们已经知道变量是在哪个类中定义的并且我们可以直接从那里更改值时,为什么要使用更长的过程来使用方法设置值而不是分配值通过使用 object.value
    • 这样做的原因之一是关于控制。通过 B 设置 A 类的值可能是有原因的。例如,B 类必须在 A 类的值更改后进行一些验证/计算。如果任何人都可以更改 A 的值,那么 B 类将永远不会知道 A 的更改,并且不会执行计算。
    • 好的。再次感谢您的回答。但是还是有一些困惑,希望你能澄清一下。从数据隐藏的角度来看,为什么不直接改变变量的值呢?为什么要使用 getter 和 setter。我的意思是最终的主要目标是改变变量的值。那为什么要这么长的过程。你能给我一个现实生活中的例子,以便我有一个清晰的概念。
    • 这一切都取决于变量的应用。如果更改变量需要检查和/或副作用(如基于值的计算),getter 和 setter 是一个好方法。 setter 的真实示例是 null 检查。
    【解决方案2】:

    您封装了声明它们的变量private,因此其他类在没有getter 或setter 方法的情况下无法访问它们。例如:

    private int num; //variable to-be defined from constructor
    public int getNum(){
     return num;
    }
    

    其他对象不能在不使用getNum()方法的情况下从this对象访问私有num变量。

    如果要更改封装的变量:

    public void changeNum(int n){
     num = n;
    }
    

    num 变量的更改不会破坏 java 语法。

    【讨论】:

      【解决方案3】:

      Getter 是公共的,而 setter 是私有的(通常)。这意味着任何对象都可以读取我们类的变量,但只有我们类的对象可以改变它们的值。这提供了某种意义上的封装,“它不会为其他对象提供比他们需要的更多的访问权限”。这是合乎逻辑的,因为假设我们的班级是汽车,而我们的对象是法拉利。比如说,新变量是法拉利的马力。只有法拉利制造商才能改变法拉利提供的马力价值。其他人只能读取,不能更改。

      回答您的第二个问题,当创建 A 的对象时,您需要初始化 A 的所有(或至少一些)变量。这类似于在上面的类比中,创建一辆新的法拉利汽车。一旦你创建了法拉利,你显然必须知道它的所有变量。此外,这里假设 B 类是“安全”类,例如 Main。 B 不能是梅赛德斯或奥迪。 (这是程序员需要处理的事情,再次通过对法拉利类使用公共/私有封装)梅赛德斯或奥迪类将无权创建法拉利汽车。只有“Main”和“Ferrari”才有。

      【讨论】:

        猜你喜欢
        • 2018-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-14
        • 1970-01-01
        • 1970-01-01
        • 2016-11-09
        • 1970-01-01
        相关资源
        最近更新 更多