java - 在 Java 中定义公共(public)库接口(interface)

标签 java libraries

<分区>

在 Java 中定义库的公共(public)接口(interface)有哪些选项。

例如,我经常发现一些东西是公开的,因为库中的另一个包需要它们(尽管仍然有一个公共(public)基础包,例如 com.stackoverflow.mylib。),所以它们不能具有包访问级别,并且通常人们不想要大量的包(似乎使用 Spring 的人也坚持拥有单独的 Controller /服务/模型/impl/等包,导致单个“功能”被迫跨越许多包,当说给定的服务可能是一个完全内部的实现细节,不供外部使用...)。

所以理想的目标是让我提供给第 3 方的 Jar 清楚地表明这些东西不会被使用,最好是完全不提供它们(API jar 中不存在),这样它他们不可能使用和编译这些内部对象/方法。

对于只应该从某种工厂(例如提供的 Spring Bean)获取的对象,更理想的是一种防止从其代码或自定义 bean 直接实例化的方法(这可能会留下一些 future 的,尚未初始化的属性升级后)。

目前我知道的两种正式方式是:

  • 在我做过的一些项目中,有一个api包(例如com.stackoverflow.mylib.api),规定只有这个包的内容可以被外部用户直接访问。
  • 在我从事的其他一些项目中,有一些自定义属性,例如@PublicSDK 标记供公众使用的对象和方法(我认为一些额外的东西可以确保只有这样标记的东西才会出现在公开分发的 javadoc 和 api jar 中)。

最佳答案

首先要问自己的是 - 您真的需要隐藏实现细节吗?

我之所以这样说,是因为这样做会产生费用,根据您的情况,这笔费用可能值得也可能不值得。

例如,如果您的 API 正在被您直属团队以外的开发人员使用,那么这笔费用可能是值得的;但是,如果只是为了在您的团队中隐藏实现细节,我认为这太过分了。

如果 API 用于您的项目,那么您尝试仅依赖于抽象类型或接口(interface)的标准就足够了(并且已经是标准)。

但是,假设您确实需要隐藏实现并只公开公共(public) API,我知道最好的方法是生成两个 jar - 一个包含公共(public) API,另一个是该 API 的实现。

如果您使用 Maven 或 Gradle 构建使用您的 API 的项目,您只需声明对 API jar(工件)的编译时依赖性和对实现 jar(工件)的运行时依赖性。

这种模式在常见的 Java API 中随处可见,最新的例子是 JSON API作为 Glassfish 的一部分单独实现。

关于java - 在 Java 中定义公共(public)库接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26138126/

相关文章:

java - 最佳编码方式

java - 独立启动 cassandra 失败,出现 FSWriteError

c++ - 除了 Boost 的文件系统之外,是否有用于操作文件和目录的良好 C++ 库?

opencv - 处理 2.2.1 不识别 OpenCV 库文件夹

java - 寻找一个java库来为JTables(swing)进行动态移动

java - 企业 Java 实体应该是愚蠢的吗?

java - 使用广播接收器在通话结束后获取最后通话记录的详细信息

java - 如何查找一个字符串是否在给定字符串的范围内

android - 如何在Android Studio中下载库?

java - 安卓工作室 : Adding a library outside of the project root