Java中包私有类的优缺点?

我最近在学习Java,并且遇到了package-private类的概念,如果我们没有指定任何类,这是默认类。 但后来我意识到:

  • 我很少看到使用包私人类。 是否有这样的理由,例如,它有严重的缺点,是多余的,还是仅仅是我读得不够? 是否有强烈的争论/反对它的用法?

  • 如果它在大多数情况下确实没有用,为什么它会成为默认值?

  • 我们应该在什么情况下在现实世界中使用包私有的? 也就是说,它何时会成为不可替代的?

  • 换句话说,默认的package-private修饰符的主要优点和缺点是什么?


    简短的回答是 - 这是一种稍宽的私人形式。

    我假设你熟悉publicprivate之间的区别,以及为什么一般来说好的做法是让方法和变量保持private如果这些方法和变量只能在课堂上单独使用。

    那么,作为一个扩展 - 如果你正在考虑以模块化方式创建你的软件,你可能会考虑为你的模块提供一个公共接口,它将在它们之间有多个类进行协作。 在这种情况下,如果方法被消费者打电话,让方法public是非常合理的; private如果他们是一个班级的内部; 和package private ,如果他们使用这个模块中的类之间的调用,也就是说,它是你的模块的实现细节(公共呼叫者可以看到),但跨越几类。

    这在实践中很少使用,因为包装系统对于这类事情不是那么有用。 你必须将给定模块的所有类转储到完全相同的包中,对于任何不重要的东西都会变得笨拙。 所以这个想法很好 - 只需要一些“附近”的类就可以访问一个方法,就像一个稍微宽一点的private - 但是对于如何定义这个类集的限制意味着它很少被使用/很有用。


    package-private的一个好处是你可以使用它来访问你认为私有的单元测试类的方法。 当然,其缺点是包中的其他类可以在它们不应该的时候调用它。


    关于“为什么会成为违约”的问题,在这种情况下,“违约”一词就意味着缺少另一个限定词。 我猜他们可能已经发明了另一个关键字(“包裹”已被采用),但他们没有。

    在现实世界中,我使用实用程序类和抽象类的默认访问权限,我不希望人们通过其他软件包调用或使用它们。 假设您有一个接口和两个具体的实现,它们从一些抽象类扩展而来。 你声明你的两个具体类是最终的,因为你不一定希望人们继承它们(见Effective Java)。 你也不希望人们出于同样的原因在你的抽象类中四处闲逛。 如果您对抽象类使用默认访问权限,那么只有在他们的类放入您的包中时,人们才会看到它。 这不是防弹的,但我认为这是对默认访问的合理使用/说明。 也就是说,它不会阻止细节泄露,即不保证任何内容,这意味着它不是一个特别有用的约定。

    为什么你没有看到它更经常使用的另一个原因是人们倾向于从javadocs中排除具有默认访问权限的类。

    链接地址: http://www.djcxy.com/p/24043.html

    上一篇: Pros and cons of package private classes in Java?

    下一篇: Internal vs. Private Access Modifiers