java - 为什么私有(private) getter 方法会违反封装性,而缺少 getter 方法则不会?

标签 java encapsulation getter

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

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

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

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

public class A {
    private String a;
}

假设所有数据字段都是私有(private)的,那么封装最多的顺序不应该是无getter方法、私有(private)getter方法和公共(public)getter方法吗?

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

最佳答案

私有(private) getter 方法不违反封装。这简直就是废话。

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

要么您误读了 OCP 示例问题和答案,要么他们犯了错误。

<小时/>

现在,他们可能想问的是示例类是否是一个良好封装的示例,或者更一般地说,是良好的面向对象设计的示例。

更新

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

<小时/>

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

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

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

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

还有其他私有(private) setter/getter 可以合法做的事情。

关于java - 为什么私有(private) getter 方法会违反封装性,而缺少 getter 方法则不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58464607/

相关文章:

java - 元素不可见 : Element is not currently visible and may not be manipulated

ruby - 我应该将该方法添加为 protected 吗?为什么?

C++ 重载 getter 两次,一次返回指针,一次返回 const 引用,失败

Kotlin 重命名生成的 Getter 和 Setter

javascript - JavaScript 中的 Getter 和 Setter。 setter 是如何实现的?用于 Angular Controller ?

java - 用于列映射的 log4j2 模式布局不起作用

java - HtmlUnit 代理问题

Java while 循环在与 scan.nextLine() 交互后终止;方法

java - 为什么静态方法可以调用私有(private)方法?

Java:哪个更快?局部变量还是访问封装?