java - 控制 Java 中的类可见性

标签 java api usability access-modifiers

我的项目当前具有以下包结构。

enter image description here

这里我添加了一个包名称utils,并在其中定义了与该模块相关的所有实用程序类。这些已被其他包(即 implinternal)使用,因此我在 util 包中创建了类和方法公开

因为它是公共(public)的,不仅此模块中的类,其他模块中的类也可以访问它,当我使用 IDE 进行编码时,它们会显示为编码建议。

我查阅了几篇研究论文,这些论文描述了这会如何降低 API 的可用性,并给参与开发的开发人员带来糟糕的体验 [ref1 , ref2] .

我知道 java 不允许我使 util 中的类可供 impl 和内部包访问,而不能让其他人访问。

将我的实用程序类放入包“util”中是否正确?或者我应该将所有相互通信的类放在同一个包中?

最佳答案

你是对的,标记为public的东西可以在任何其他包中使用。与其他语言相比,Java 不提供除此之外的任何控制。

一个简单的解决方法:拥有一个特殊包可能会有所帮助,其中包含应可供外部用户使用的公共(public)内容。

含义:创建类似 com.whatever.product.api 的内容 - 并指示您的用户可以使用其中的所有内容 - 但不能使用其他内容。

换句话说:您将需要公开的所有内容公开;但您将这些东西收集在一个特殊的地方,并允许其他人使用。

值得一提的是,Java9将引入的概念modules ,这些允许您定义哪些包应该对模块的用户公开。从这个意义上说,java 9 模块允许您区分“内部”和“外部”公共(public)

关于java - 控制 Java 中的类可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43119302/

相关文章:

usability - 关于可用性和 "prettyness"的争论

java - 将多个操作映射到同一个类 struts 2.3 是最佳实践吗

java - 使用 Gson 将内部 ArrayList<POJO> 转换为 JSON

api - 我可以在我的 Go 程序中直接使用 go-ipfs 吗?

c# - 带有 OAuthBase.cs 的雅虎 Oauth API

javascript - 触发 Javascript 表单字段验证和格式化的事件是什么?

usability - 自动重定向用户还是向他们显示错误的请求页面更好?

java - Spring中的循环依赖

java - 线程 "main"java.lang.RuntimeException : Uncompilable source code - Erroneous tree type: <any> 中的错误异常

java - 如何使用枚举的简单性设计易于扩展的 API?