为什么私有 getter 方法会违反封装,而缺少 getter 方法却不会?

Why do private getter methods violate encapsulation, but the lack of getter methods does not?

我正在为 OCP 8 做一些练习题。

一个问题的特点是 class 带有私有字段和私有 getter 方法。正确答案是这段代码违反了封装,因为 getter 方法应该是 public.

public class A {
    private String a;
    private String getA() { return a; }
}

但是,另一个问题的特点是 class 带有私有字段,根本没有 getter 方法。正确答案是这段代码遵循封装原则。

public class A {
    private String a;
}

假设所有的数据字段都是私有的,那么封装最多到最少的顺序不应该是没有getter方法,私有getter方法和publicgetter方法?

我知道我的问题听起来可能基于个人观点,但考试并非如此。

因为,如果您将 getter 设为私有,则无法在另一个 class 中访问该数据成员。我们使用 getter 访问另一个 class 中的私有数据成员。因此,如果您将 getter 设为私有,那么 getter.

有什么用

私有 getter 方法不违反封装。简直是胡说八道。

这里不发表意见。事实上,Java 私有方法只能在声明它的 class 中调用。即在封装边界内。

要么是你看错了OCP示例问答,要么是他们搞错了。


现在可能是他们想问的是示例 class 是 良好 封装的示例还是更普遍的良好 OO 设计的示例。

更新

看到示例代码,很难说是哪种方式。做出判断太不现实了。 (该代码实际上是无用的,但除非我们知道它的 预期 用途是什么,否则我们不能真正称其为糟糕的设计。)


另一个答案似乎在争论私有 getter 是无用的。我不同意。特别是因为 getter 除了简单地返回一个值之外还可以做其他事情。考虑一下:

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

private synchronized int getBalance() {
    return this.balance;
}

这确保调用者将看到余额字段的当前值,即使它刚刚被另一个线程更新。当然我们可以用其他方式来做,但这种方式很好职责分离

还有其他私人 getter 可以合法做的事情。