改进Java中的包私有类

时间:2014-06-02 13:25:50

标签: java coding-style class-visibility

根据我的经验,Java中类的包私有可见性变得多余。

包 - 私有可见性似乎基于这样一个前提,即另一个类几乎私有使用的类可能保存在同一个包中。通常情况并非如此。 有人在探索改进的访问修饰符/备用机制吗?

尝试使用包私有可见性时出现问题:

  • 我们很想将功能不相关的类放在同一个包中 获得这个好处

使用public的问题:

  • API受到污染。一旦导入了库Jar,客户端就会看到其他几个他不必担心的公共类
  • 从编码标准的角度来看,没有简单的方法可以确保开发人员不按时完成短路调用 (通过短路调用我的意思是绕过一个层的方法调用(比如从Servlet直接到绕过bean / BO的DAO)

目前的解决方法:

  • 为了阻止短路调用,我们通常将应用程序的不同部分打包到几个JAR中,并确保每个构建的构建环境中只有相应的JAR可用。 (例如,在编译swing客户端类时,server.jar将不可用。只有客户端类和common.jar可用。)

问题:

  1. 提出新的可见性不会有用 改性剂/替代?
  2. 这些方面的内容已经在管道中了吗?
  3. 像Spring / Guice这样的框架是否有足够的替代品?

2 个答案:

答案 0 :(得分:1)

  1. 是的,我认为这很有用。

  2. 我认为您正在寻找的是project jigsaw,它最终将成为Java 9.我不是这方面的专家,但您可以查看以下问题及其答案得到一个主意:

  3. 我没有这些框架的经验。

答案 1 :(得分:0)

看起来像是来自scala的功能。存在访问修饰符的范围。我发现this tutorial很有用。

方法可以在某个包的范围内是私有的

package company.module.domain

class Example {
  private[module] def moduleMethod = ???
  private[domain] def domainMethod = ???
}

在此示例中,moduleMethod在包module及其子包(如domain)中的任何位置都可用。方法domainMethod仅在domain包中可见,在外部不可见。

不幸的是,此功能与java不兼容,并且这些限制被编译为字节代码而丢失了限制,例如to public