protected
关键字是否允许从同一个包中访问字段/方法(与没有修饰符允许的方式相同)是否有任何正当理由?为什么Java语言中包含了包私有可见性?在我看来,允许通过位于同一个包中的类/方法修改字段是违反封装原则的。想象一下,我想重构代码并将类移到另一个包中。
它会打破代码!
我认为这两种可见性都是过去一些过时且准备不足的特征。这几天有没有理由使用它们,同时防止意大利面条斑点?
答案 0 :(得分:2)
包私有可见性不会违反封装,而不是私有可见性,但在不同的级别上:而不是在细粒度的逐类级别上运行,包私有可见性允许您控制封装在更粗粒度的逐包级别。在创建需要对模块中的所有其他类可见的辅助类时,这可能很重要,但在其外部不可见。对于你来说,模块的作者,这样的类构成了一个私有的实现细节,所以如果你把它们移到另一个包中,你就不会冒任何其他人的代码;只有你的代码可能需要重构。
另一方面,受保护的可见性控制沿着“垂直”继承行的访问(而不是包 - 私有可见性,这是“水平”)。
答案 1 :(得分:1)
绝对。包私有可见性可能是我最常使用的可见性级别。
课程并不总是最好的组织单位。在许多情况下,您正在设计两个或多个紧密协作的类。或者你有一个类,但它变得如此之大,以至于你想把它分成多个文件。
private
访问是隐藏类级实现细节的方法,但仍然需要(并且合理!)来获取您仍希望隐藏的包级别实现细节
答案 2 :(得分:0)
与公共访问相比,程序包可见性提供更严格的访问权限。这允许您仅将API的某些部分公开给您的包,而不会将其暴露给世界。
对于字段,将包可见性设置为默认值使未封装的数据成为默认值。但是,对于方法,将包可见性作为默认设置可以更容易地为初学者使用Java。两个规则都会降低语言的复杂性。
答案 3 :(得分:0)
惊讶没有人提到TDD:没有package-private
你必须使用protected
,这将是非常糟糕的,因为你会不必要地将内部负载暴露给任何子类。
package-private
用于测试目的?
目前的安排非常优雅,因为正如每个TDD-er所知,只要您的测试类的包装名称与测试中的应用类别相匹配,您甚至不必包括您的测试类在相同的实际目录结构中,它有两个优点:1)您不必混淆应用程序代码和测试代码; 2)您可以根据需要构建测试代码,例如单元测试的单独目录结构,功能测试,端到端测试等。