用Java定义库的公共接口有哪些选项。
例如,我经常发现事情是公开的,因为库中的另一个包需要它们(虽然仍然有一个共同的基础包,例如com.stackoverflow.mylib。),所以它们不具备包访问级别一般人们都不想要大量的软件包(使用Spring的人似乎也坚持使用单独的控制器/服务/模型/ impl / etc等软件包,因此产生了一个单一的功能"被迫跨越许多包,当说某个服务可能是一个完全内部的实现细节而不是外部使用时......)。
所以理想的目标是让第一方提供的Jar我明确表示不会使用这些东西,理想情况是没有它们可用(不存在于API jar中),所以它他们无法使用这些内部对象/方法进行编译。
更理想的是,对象只能从某种工厂(例如提供的Spring Bean)中获取,这是一种防止从代码或自定义bean直接实例化的方法(这可能会留下一些未来,尚未存在的属性未初始化升级后。)
我目前了解的两种正式方式是:
答案 0 :(得分:1)
首先要问自己的是 - 你真的需要隐藏实现细节吗?
我说这个的原因是这样做会涉及到费用,这取决于你的情况可能会或可能不值得支付。
例如,如果您的API正在您的直接团队之外的开发人员使用,那么它可能值得花费;但是,如果只是隐藏你团队中的实施细节,我认为这有点过头了。
如果API是在您的项目中使用的,那么您尝试仅依赖于抽象类型或接口的标准就足够了(并且已经是标准)。
但是,假设您确实需要隐藏实现并仅公开公共API,我知道这样做的最好方法是生成两个jar - 一个包含公共API,另一个包含该API的实现。< / p>
如果您正在使用Maven或Gradle来构建使用您的API的项目,您只需声明API jar(工件)的编译时依赖性以及对实现jar(工件)的运行时依赖性。
这种模式可以在所有常见的Java API中看到,最新的例子是JSON API,它是作为Glassfish的一部分单独实现的。