我有一个依赖于库X的实用程序类U,并且必须放在一个包中,该程序包将用于具有X的程序(它应该执行正常的东西),以及没有X的地方(它应该什么都不做).在没有将类分成两部分的情况下,我找到了一个简单的模式来解决这个问题:
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实现?是否有既定的模式?以上代码片段是否太过于无法将其投入生产?