隐藏服务实现的最佳实践

Ale*_*der 5 java design-patterns

我想隐藏API用户的服务(接口)的实现(具体类).该实现由使用Java API ServiceLoader机制的工厂提供给用户.此Loader要求实现类具有公共可见性.只要实现隐藏在用户不直接依赖的不同JAR(除了API JAR之外),就可以了.

但是,为了便于分发,使用默认实现的JAR内容将打包到API JAR中.因此,用户有效地依赖于此预先打包的JAR,其中默认实现类可用于公共可见性.没有什么能阻止人们直接实例化实现.我不希望那是可能的.

我的坏主意:

  • 实现自己的ServiceLoader版本,允许加载包私有实现(顺便说一下,为什么Java API ServiceLoader不允许这样做?)
  • 发布单独的API和实现JAR

您认为正确的方法是什么?妥协吗?

使用OSGi或其他重型机械是不可能的.

Joo*_*gen 3

也许令人失望,但是:

  • 制作一个单独的罐子并将其与其他第三方罐子放在一起。
  • 让安装程序/部署过程处理所有的良好打包。
  • 不要在编译时使该 jar 可用;行家:<scope>runtime</scope>.

唯一的其他方法是@Deprecated在 javadoc 中包含如何使用 java 服务 API 来使用相应类的注释。