为什么私有 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 可以合法做的事情。
我正在为 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 可以合法做的事情。