[英]Controlling Class Visibility in Java
我的项目目前具有以下软件包结构。
在这里,我添加了一个程序包名称utils
并在其中定义了与此模块相关的所有实用程序类。 这些已被其他软件包(即impl
, internal
)使用,因此我将util
软件包中的类和方法util
public
。
因为,这是公共的,所以不仅此模块中的类,其他模块中的类也可以访问它,当我使用IDE进行编码时,它们将显示为编码建议。
我浏览了几篇研究论文,描述了这如何降低API的可用性并给参与开发的开发人员以糟糕的体验[ref1 , ref2] 。
我知道Java不允许我使util
内部的类可用于impl
和内部包,而不impl
其他人访问。
将实用程序类放入“ util”包是否正确? 还是应该将所有相互通信的类放在同一个包中?
实用程序类很好。 实用程序类是在项目中的多个位置使用但实际上并不属于特定类的功能。
在OOP的完美世界中,不会有任何util类,但是,如果不属于特定类,则创建util类被认为是一种好习惯。
您在此处列出了用于访问修饰符的选项: https : //docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
有一种方法可以实现您想要的目标,但是这被认为是非常糟糕的做法。 您可以将util类的访问修饰符更改为protected
。 这将使您的util类可以从子类和包中访问。 因此,如果一个类需要访问util类之一,则它必须扩展此util类,从而成为子类。 我不能强调它,这是一个非常糟糕的做法。
没错,标记为public的东西可以在其他任何软件包中使用。 与其他语言相比,Java除了提供其他功能外,不提供任何控制。
一个简单的解决方法:拥有一个特殊的软件包,其中包含那些应该供外部用户使用的公共物品,可能会有所帮助。
含义:创建类似com.whatever.product.api
类的com.whatever.product.api
-并指示您的用户可以使用此处的所有内容,但别无其他。
换句话说:您将所有需要公开的东西都公开了; 但是您将这些东西收集在允许他人使用的特殊地方。
值得一提的是,Java9将引入模块的概念,这些概念使您可以定义哪些软件包应该对模块用户 公开 。 从这个意义上讲,java 9模块允许您区分“内部”和“外部” public 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.