我想对 API 用户隐藏服务(接口)的实现(具体类)。该实现由使用 Java API ServiceLoader机制的工厂提供给用户。此 Loader 要求实现类具有公共可见性。只要实现隐藏在用户不直接依赖的不同 JAR(API JAR 除外)中,就可以了。
但是,为了便于分发,具有默认实现的 JAR 的内容被打包到 API JAR 中。因此,用户有效地依赖于这个预打包的 JAR,其中默认实现类可用于公共可见性。没有什么能阻止人们直接实例化实现。我不希望这成为可能。
我的坏主意:
- 实现一个自己的 ServiceLoader 版本,它允许加载包私有实现(顺便说一句,为什么 Java API ServiceLoader 不允许这样做?)
- 提供单独的 API 和实现 JAR
您认为正确的方法是什么?有什么妥协吗?
使用 OSGi 或其他重型机器是不可能的。