ライブラリ X に依存するユーティリティ クラス U があり、X が使用可能なプログラム (通常の処理を実行する必要がある場所) と X を使用しない場所 (何も実行しない場所) から使用されるパッケージに入れる必要があります。クラスを 2 つに分割せずに、これを解決する単純なパターンを見つけました。
package foo;
import bar.MisteriousX;
public class U {
static private boolean isXPresent = false;
static {
try {
isXPresent = (null != U.class.getClassLoader().loadClass("bar.MisteriousX"));
} catch (Exception e) {
// loading of a sample X class failed: no X for you
}
}
public static void doSomething() {
if (isXPresent) {
new Runnable() {
public void run() {
System.err.println("X says " + MisteriousX.say());
}
}.run();
} else {
System.err.println("X is not there");
}
}
public static void main(String args[]) { doSomething(); }
}
このパターンでは、U はコンパイルするために X の存在を必要としますが、X の存在の有無にかかわらず実行されたときに期待どおりに動作します。X ライブラリへのすべてのアクセスが内部クラス内でない限り、このコードはクラスローダー例外を起動します。
質問: インポート解決はどこでもこのように機能することが保証されていますか? それとも JVM/ClassLoader の実装に依存しますか? これには確立されたパターンがありますか?上記のコード スニペットはハックすぎて製品化できませんか?