控制 Class 在 Java 中的可见性
Controlling Class Visibility in Java
我的项目当前具有以下包结构。
这里我添加了一个包名utils
,并在其中定义了与该模块相关的所有实用程序类。这些已被其他包(即 impl
、internal
)使用,因此我在 util
包 public
中制作了 类 和方法。
因为,它是public,不仅在这个模块中类,其他模块中的类也可以访问它,当我使用我的IDE编码时它们显示为编码建议。
我浏览了几篇研究论文,这些论文描述了这会如何降低 API 的可用性并给参与开发的开发人员带来糟糕的体验 [ref1, ref2]。
我明白 java 不允许我让 util
内部的 类 可供 impl
和内部包访问,但其他人不能访问。
将我的实用程序 类 放入程序包 'util' 是否正确?或者我应该将所有相互通信的 类 放在同一个包中吗?
Util class没问题。 Util classes 是在项目中多个地方使用但实际上并不属于特定 class 的功能。
在 OOP 的完美世界中不会有任何 util classes,但是如果它们不属于特定的,则创建 util classes 被认为是一个很好的做法class.
此处列出了您的访问修饰符选项:
https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
有一种方法可以达到您想要的效果,但被认为是一种非常糟糕的做法。您可以将 util classes 的访问修饰符更改为 protected
。这将使您的 util classes 可以从 subclasses 和包中访问。因此,如果 class 需要访问其中一个 util classes,那么它必须扩展此 util class,从而成为一个 subclass。 我怎么强调都不为过,这是一个非常糟糕的做法。
你是对的,标记为 public 的东西可以在 any 其他包中使用。与其他语言相比,Java 不提供除此之外的任何控制。
一个简单的解决方法:一个特殊包可能会有所帮助,其中包含那些public应该可用的东西给您的外部 用户。
意思是:创建类似 com.whatever.product.api
的东西 - 并指示您的用户他们可以使用那里的所有内容 - 但别无其他。
换句话说:您需要public public;但是你把那些东西收集在一个特殊的地方,你允许其他人使用。
值得一提的是 Java9 将引入 modules 的概念,这些概念允许您定义哪些包应该是 public 到您模块的 用户 。从这个意义上说,java 9 个模块可以让你区分 "internal" 和 "external" public.
我的项目当前具有以下包结构。
这里我添加了一个包名utils
,并在其中定义了与该模块相关的所有实用程序类。这些已被其他包(即 impl
、internal
)使用,因此我在 util
包 public
中制作了 类 和方法。
因为,它是public,不仅在这个模块中类,其他模块中的类也可以访问它,当我使用我的IDE编码时它们显示为编码建议。
我浏览了几篇研究论文,这些论文描述了这会如何降低 API 的可用性并给参与开发的开发人员带来糟糕的体验 [ref1, ref2]。
我明白 java 不允许我让 util
内部的 类 可供 impl
和内部包访问,但其他人不能访问。
将我的实用程序 类 放入程序包 'util' 是否正确?或者我应该将所有相互通信的 类 放在同一个包中吗?
Util class没问题。 Util classes 是在项目中多个地方使用但实际上并不属于特定 class 的功能。
在 OOP 的完美世界中不会有任何 util classes,但是如果它们不属于特定的,则创建 util classes 被认为是一个很好的做法class.
此处列出了您的访问修饰符选项: https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
有一种方法可以达到您想要的效果,但被认为是一种非常糟糕的做法。您可以将 util classes 的访问修饰符更改为 protected
。这将使您的 util classes 可以从 subclasses 和包中访问。因此,如果 class 需要访问其中一个 util classes,那么它必须扩展此 util class,从而成为一个 subclass。 我怎么强调都不为过,这是一个非常糟糕的做法。
你是对的,标记为 public 的东西可以在 any 其他包中使用。与其他语言相比,Java 不提供除此之外的任何控制。
一个简单的解决方法:一个特殊包可能会有所帮助,其中包含那些public应该可用的东西给您的外部 用户。
意思是:创建类似 com.whatever.product.api
的东西 - 并指示您的用户他们可以使用那里的所有内容 - 但别无其他。
换句话说:您需要public public;但是你把那些东西收集在一个特殊的地方,你允许其他人使用。
值得一提的是 Java9 将引入 modules 的概念,这些概念允许您定义哪些包应该是 public 到您模块的 用户 。从这个意义上说,java 9 个模块可以让你区分 "internal" 和 "external" public.