Java中的protected字段有什么意义,因为它破坏了数据封装原则?

What's the point of protected fields in Java since it breaks the data encapsulation principle?

以下是引用自"Core Java"的句子:

Suppose your class is used by other programmers and you designed it with protected fields. Unknown to you, other programmers may inherit classes from your class and start accessing your protected fields. In this case, you can no longer change the implementation of your class without upsetting those programmers. That is against the spirit of OOP, which encourages data encapsulation.

因此,我想知道保护字段在Java中的意义是什么?

如果 super class 和 sub class 不是由同一开发人员(或同一组织)维护,则不鼓励。但是,如果 super class 和 sub class 是紧密耦合的代码,这是一种有用的技术。比如同一个库的组件。

打个比方,在商业世界中,每笔交易都应该受到某些法律合同的保护,有人会说 "discouraged" 在没有某些法律合同保护的情况下进行交易。如果双方是不同的商业实体,那将是正确的。但是,当当事人不是企业实体而是同一家族成员时,显然不能适用同样的原则。

OOP 是关于代码组织的。在不同的情况下,将需要不同的组织原则。

我认为它在抽象 classes 中更有用。例如,我最近为一个视频游戏写了一篇摘要 class,其中有一个旋转场(一个角度)。抽象的class不太关心角度是怎么计算的,具体的class会根据自己的需要负责设置。抽象的class使用它,具体的class设置它。

还有其他方法可以做到这一点。另一种变体是让具体 class 实现一个名为 getAngle 的方法,抽象 class 会在需要旋转值时调用该方法,但出于性能目的我没有走这条路。