为什么私有的getter方法违反了封装,但是缺少getter方法却没有呢?

K M*_*Man 0 java getter encapsulation

我正在为OCP 8处理一些练习问题。

一个问题涉及一类具有私有字段和私有获取方法的类。正确的答案是该代码违反了封装,因为getter方法应该是公共的。

public class A {
    private String a;
    private String getA() { return a; }
}
Run Code Online (Sandbox Code Playgroud)

但是,另一个问题是具有私有字段且根本没有getter方法的类。正确的答案是该代码遵循封装原则。

public class A {
    private String a;
}
Run Code Online (Sandbox Code Playgroud)

假设所有数据字段都是私有的,那么大多数封装的顺序不应该至少是无获取方法,私有获取方法和公共获取方法吗?

我知道我的问题听起来可能是基于意见的,但考试却不是。

Ste*_*n C 7

专用的getter方法不违反封装。那只是胡说八道。

我在这里没有发表意见。事实是,只能在声明它的类中调用Java私有方法。那就是封装的边界之内。

您可能是看错了OCP示例问题和答案,或者他们犯了一个错误。


现在可能是他们要问的是示例类是好的封装示例还是更一般的OO设计示例。

更新

看示例代码,很难说出一种方法。做出判断是不现实的。(该代码实际上是无用的,但是除非我们知道其预期用途,否则我们不能真正称其为不良设计。)


另一个答案似乎是在争论私人获取者是无用的。我不同意。尤其是因为获取程序可能会做其他事情,而不仅仅是返回值。考虑一下:

private synchronized void setBalance(int newBalance) {
    this.balance = newBalance;
}

private synchronized int getBalance() {
    return this.balance;
}
Run Code Online (Sandbox Code Playgroud)

这样可以确保调用方将看到balance字段的当前值,即使该值刚刚被另一个线程更新。当然,我们可以通过其他方式做到这一点,但是这种方式可以很好地划分职责

还有一个私人获取者可以合法地做的事情。