受保护和包裹私密的可见性

时间:2013-06-24 20:00:36

标签: java visibility

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

我认为这两种可见性都是过去一些过时且准备不足的特征。这几天有没有理由使用它们,同时防止意大利面条斑点?

4 个答案:

答案 0 :(得分:2)

包私有可见性不会违反封装,而不是私有可见性,但在不同的级别上:而不是在细粒度的逐类级别上运行,包私有可见性允许您控制封装在更粗粒度的逐包级别。在创建需要对模块中的所有其他类可见的辅助类时,这可能很重要,但在其外部不可见。对于你来说,模块的作者,这样的类构成了一个私有的实现细节,所以如果你把它们移到另一个包中,你就不会冒任何其他人的代码;只有你的代码可能需要重构。

另一方面,受保护的可见性控制沿着“垂直”继承行的访问(而不是包 - 私有可见性,这是​​“水平”)。

答案 1 :(得分:1)

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

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

private访问是隐藏类级实现细节的方法,但仍然需要(并且合理!)来获取您仍希望隐藏的包级别实现细节

答案 2 :(得分:0)

与公共访问相比,程序包可见性提供更严格的访问权限。这允许您仅将API的某些部分公开给您的包,而不会将其暴露给世界。

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

答案 3 :(得分:0)

惊讶没有人提到TDD:没有package-private你必须使用protected,这将是非常糟糕的,因为你会不必要地将内部负载暴露给任何子类。

TDD似乎已经被发明了#34;在Java创建之后,但测试类的想法显然早于完整的TDD。我想知道Java设计师是否准确地设计了package-private用于测试目的?

目前的安排非常优雅,因为正如每个TDD-er所知,只要您的测试类的包装名称与测试中的应用类别相匹配,您甚至不必包括您的测试类在相同的实际目录结构中,它有两个优点:1)您不必混淆应用程序代码和测试代码; 2)您可以根据需要构建测试代码,例如单元测试的单独目录结构,功能测试,端到端测试等。