在Java中定义公共库接口

时间:2014-10-01 09:24:58

标签: java libraries

用Java定义库的公共接口有哪些选项。

例如,我经常发现事情是公开的,因为库中的另一个包需要它们(虽然仍然有一个共同的基础包,例如com.stackoverflow.mylib。),所以它们不具备包访问级别一般人们都不想要大量的软件包(使用Spring的人似乎也坚持使用单独的控制器/服务/模型/ impl / etc等软件包,因此产生了一个单一的功能"被迫跨越许多包,当说某个服务可能是一个完全内部的实现细节而不是外部使用时......)。

所以理想的目标是让第一方提供的Jar我明确表示不会使用这些东西,理想情况是没有它们可用(不存在于API jar中),所以它他们无法使用这些内部对象/方法进行编译。

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

我目前了解的两种正式方式是:

  • 在我参与的一些项目中,有一个api包(例如com.stackoverflow.mylib.api),规则只是外包用户可以直接访问此包的内容。
  • 在我参与过的其他一些项目中,有一些自定义属性,例如: @PublicSDK标记公众使用的对象和方法(我想一些额外的东西,以确保只有标记为这样的东西在公共分发的javadoc和api jar中)。

1 个答案:

答案 0 :(得分:1)

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

我说这个的原因是这样做会涉及到费用,这取决于你的情况可能会或可能不值得支付。

例如,如果您的API正在您的直接团队之外的开发人员使用,那么它可能值得花费;但是,如果只是隐藏你团队中的实施细节,我认为这有点过头了。

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

但是,假设您确实需要隐藏实现并仅公开公共API,我知道这样做的最好方法是生成两个jar - 一个包含公共API,另一个包含该API的实现。< / p>

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

这种模式可以在所有常见的Java API中看到,最新的例子是JSON API,它是作为Glassfish的一部分单独实现的。

相关问题