サービス(インターフェース)の実装(具象クラス)をAPIユーザーから隠したい。実装は、Java API ServiceLoaderメカニズムを使用するファクトリによってユーザーに提供されます。このローダーでは、実装クラスが公開されている必要があります。ユーザーが直接依存していない別の JAR (API JAR を除く) に実装が隠されている限り、これは問題ありません。
ただし、簡単に配布できるように、デフォルト実装の JAR のコンテンツは API JAR にパックされています。したがって、ユーザーは、デフォルトの実装クラスが公開されているこの事前パックされた JAR に事実上依存しています。人々が実装を直接インスタンス化することを妨げるものは何もありません。私はそれを可能にしたくありません。
私の悪い考え:
- パッケージのプライベート実装をロードできる ServiceLoader の独自のバージョンを実装します (ところで、なぜ Java API ServiceLoader はこれを許可しないのですか?)
- 別の API と実装 JAR を出荷する
正しい方法は何だと思いますか?妥協はありますか?
OSGi やその他の重機を使用することは論外です。