何时在java中打包私有(无显式修饰符)?

何时在java中打包私有(无显式修饰符)?,java,class-visibility,Java,Class Visibility,我一直在读教程。我对使用包私有的好用例感到困惑。因为据我所知,您总是可以将包声明更改为此类的任何包声明,并将其作为公共类。我明白这不是一件好事,但什么阻止了我 因为据我所知,您可以随时将包声明更改为此类的任何包声明,并将其视为公共类 首先,访问修饰符是用来帮助开发人员的。他们总是有办法的,比如说 我知道这不是一件好事,但什么阻止了我? 真的不多 但是,作为一名开发人员,您可以在密封的.jar文件中分发类,这基本上意味着您不允许任何其他人进入您的包 从 在JAR文件中密封包 JAR文件中的包可以选

我一直在读教程。我对使用包私有的好用例感到困惑。因为据我所知,您总是可以将包声明更改为此类的任何包声明,并将其作为公共类。我明白这不是一件好事,但什么阻止了我

因为据我所知,您可以随时将包声明更改为此类的任何包声明,并将其视为公共类

首先,访问修饰符是用来帮助开发人员的。他们总是有办法的,比如说

我知道这不是一件好事,但什么阻止了我?

真的不多

但是,作为一名开发人员,您可以在密封的.jar文件中分发类,这基本上意味着您不允许任何其他人进入您的包

在JAR文件中密封包

JAR文件中的包可以选择密封,这意味着该包中定义的所有类都必须归档在同一JAR文件中。例如,您可能希望密封一个包,以确保软件中的类之间的版本一致性

关于“什么在阻止我”:


Java安全机制可能会阻止您。如果“目标”包是密封和签名的,那么Java将不允许原始包以外的任何源声明该包中的类。

使用包私有类/方法的几个原因:

  • 属于库的一部分,但不属于库API的一部分的实现类。这允许您仍然拥有模块化代码,并向API用户表明实现类不可作为API的一部分使用
  • 使测试可用。有时(特别是在处理遗留代码时),您需要使类或成员更可见,以便可以更轻松地对它们进行单元测试。一个示例可能是使用一个方法测试一个类,该方法执行一个资源密集型操作,您希望在测试中使用无操作版本覆盖该操作。另一个例子是一个只在一个地方使用的类:它不希望对整个应用程序可见,但需要进行单元测试

  • 在这两种情况下,使用包私有可见性有助于使您的代码更易于使用(使用它的人对类/成员的预期用途有更好的了解),同时允许您仍然使用模块化代码。

    在实践中,它几乎没有任何用处:几乎所有元素都是
    公共的
    private
    protected
    .IMHO,成员的默认值应该是private。我发现packagelocal很有用,但它应该类似于
    packageint字段
    因为据我所知,您可以随时将包声明更改为此类类的任何包声明,并将其视为公共类。
    您可以,但实际上不会。想象一下,如果您访问第三方库,将您自己的包名更改为第三方库的包名是非常糟糕的做法,因为您侵犯了其他人的名称空间。我不知道在JAR文件中密封包。很高兴知道。我真的很喜欢你在这里概述的第一个原因,我想知道为什么我在我所使用的代码库中没有看到这么多