Java中包私有类的改进

3
在我的经验中,Java中的包私有可见性似乎已经变得多余了。
包私有可见性似乎基于这样一个前提:几乎被另一个类私有使用的类很可能会保留在同一包中。但实际情况往往并非如此。是否有人正在探索改进的访问修饰符/替代机制?
试图使用包私有可见性的问题:
我们会尝试将功能不相关的类放在同一个包中以获得这种好处。
使用public的问题:
API会被污染。一旦导入库Jar,客户端就会看到其他几个他不需要关心的公共类。
从编码标准的角度来看,没有简单的方法可以确保开发人员不会在时间紧迫时进行短路调用。(我所说的短路调用是指绕过层(例如从Servlet直接到DAO,绕过bean/BO)的方法调用)
目前的解决方法:
为了防止短路调用,我们通常将应用程序的不同部分打包成几个JAR,并确保每个构建环境中只有相应的JAR可用。(例如,在编译Swing客户端类时,server.jar将不可用。只有客户端类和common.jar可用。)
问题:
1.是否有必要提出新的可见性修饰符/替代方法?
2.是否已经有类似的东西在计划中?
3.Spring/Guice这样的框架是否足以替代?

将每个字段、方法和类都设置为私有或公共的,但对于被设计为可扩展的类除外。 - Gilbert Le Blanc
@GilbertLeBlanc 这个问题也提供了一些相同情况的细节:https://dev59.com/0V7Va4cB1Zd3GeqPL63n - Teddy
2个回答

1

对于(2)来说,Jigsaw似乎是一种模块化和即插即用的解决方案,可用于集成大量模块。我的问题更多地涉及单个模块的实现,其中明显存在公共对我的类但不是公共对客户端的类。 - Teddy
你说得对,目前来看OSGi似乎是最接近的替代方案。尽管我想知道是否有意义仅仅为了使我的模块自包含、模块化和隐藏内部而使用OSGi。OSGi似乎带来了更多的负担。 - Teddy

1

看起来是来自scala的特性。有访问修饰符的作用域。我发现这个教程很有用。

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

package company.module.domain

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

在这个例子中,moduleMethodmodule 包及其子包(如 domain)中随处可用。方法 domainMethod 仅在 domain 包中可见,在外部不可见。
不幸的是,这种功能与 java 不兼容,这些限制被编译为字节码,并失去了一些限制,例如 to public

从您链接的教程中可以看出,“通过使用限定符,并且由于Scala理解嵌套包,您在Scala中比在Java中拥有更细粒度的控制权。” Scala具有出色的设计。 - Teddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接