2

protected关键字允许从同一个包访问字段/方法是否有任何充分的理由(与没有修饰符允许的方式相同)?为什么 Java 语言中包含包私有可见性?在我看来,允许通过位于同一包中的类/方法修改字段是违反封装原则的。想象一下,我想重构代码并将类移动到另一个包中。它会破坏密码!

我认为这两种可见性都是过去的一些过时且准备不足的功能。这些天有什么理由使用它们并同时防止意大利面斑点吗?

4

4 回答 4

2

包私有可见性并不像私有可见性那样违反封装,而是在不同的级别上:而不是在逐个类的细粒度级别上操作,包私有可见性允许您以更粗略的方式控制封装逐个包级别的粒度。这在您创建需要对模块中的所有其他类可见但不能在模块外部可见的帮助类的情况下可能很重要。对你,模块的作者来说,这些类构成了一个私有的实现细节,所以如果你将它们移动到不同的包中,你不会冒破坏其他人代码的风险;只有您的代码可能需要重构。

另一方面,受保护的可见性控制沿“垂直”继承线的访问(与“水平”的包私有可见性相反)。

于 2013-06-24T20:04:50.193 回答
1

绝对地。包私有可见性可能是我最常使用的可见性级别。

班级并不总是最好的组织单位。在许多情况下,您正在设计两个或多个紧密协作的类。或者你有一个类,但它变得如此之大以至于你想把它分成多个文件。

private访问是隐藏类级实现细节的方法,但仍然有必要(并且合理!)拥有您仍然希望隐藏的包级实现细节。

于 2013-06-24T20:05:12.023 回答
0

包可见性提供比公共访问更严格的访问。这允许您仅将部分 API 公开给您的包,而无需将其公开。

对于字段,将包可见性设为默认值会使未封装的数据成为默认值。但是,对于方法,将包的可见性设为默认设置会使初学者更容易使用 Java。对两者都有一个规则可以降低语言的复杂性。

于 2013-06-24T20:04:03.087 回答
0

令人惊讶的是,没有人提到 TDD:如果没有package-private你就必须使用protected,这将是可怕的,因为你将不必要地向任何子类公开大量内部组件。

TDD 似乎是在创建 Java 之后“发明”的,但测试类的想法显然早于成熟的 TDD。我想知道 Java 设计者是否package-private准确地设计了用于测试目的?

当前的安排非常优雅,因为正如每个 TDD 开发人员都知道的那样,只要您的测试类的包名称与被测应用程序类的包名称匹配,您甚至不必将您的测试类包含在同一个实际目录中结构,它有两个优点:1)您不必混淆应用程序代码和测试代码,以及 2)您可以根据需要构建测试代码,例如用于单元测试、功能测试、端到端的单独目录结构- 结束测试等

于 2017-02-10T20:17:00.810 回答