1

不从定义类继承的类可以访问受保护的方法这一事实一直困扰着我。我经常在抽象类中使用抽象保护方法来让子类定义功能。实际上,这些是私有方法——它们不打算在类层次结构之外调用。然而,Java 并没有给我一个这样说的方法,因为受保护的方法可以被包中的任何类调用。

我的问题是,允许这样做的设计原理是什么?是否存在需要一种只能在包中或由包外的随机子类调用的方法的有效用例?我从来没有遇到过这种情况,我想知道其他人是否遇到过。

4

2 回答 2

1

在大型项目中,测试类调用被测类的内部方法是很常见的,并且受保护或包级访问允许这样做。

在我看来,protected修饰符更像是一种文档功能,而不是用于封装代码的强制机制。通过将方法或字段标记为受保护,您向其他开发人员表明,相关代码是内部实现细节,在未来版本中可能会发生变化,而不是该类的公共 API 的一部分。

通过强制转换和反射,其他开发人员通常可以获得您不希望他们使用的代码。如果一个方法调用在被其他类调用时可能有害,则解决方案不是尝试使用 Java 的访问规则将其锁定。它是重构类以支持不可变的数据结构和干净的关注点分离。

于 2012-06-22T20:15:40.810 回答
0

这个问题的解决方案听起来像是重新组织您的项目以包含多个包,以便每个包都有超类、它们的子类,没有别的。这更像是一种解决方法,而不是一个硬而快速的解决方案,但它应该做你想做的事情。

于 2012-06-22T19:52:36.057 回答