我正在考虑将dbus函数添加到使用swing的java程序中,因此脚本可用于执行某些功能。 这个东西也必须在windows上运行,dbus不可用。
所以我想做以下事情:
dbus.java:
import dbus; //Whatever the module is called
class dbus implements some_interface {
//blah blah
}
dbus_fake.java
class dbus_fake implements some_interface {
//full of empty methods
}
dbus_manager.java
class dbus_manager {
static some_interface get_dbus() {
try {
return new dbus(); //This should fail when loading the class, because the imports are not satisfied.
} except {
return new fake_dbus();
}
}
}
你认为这是个好主意吗?会有用吗?有没有更好的方法呢?
答案 0 :(得分:7)
不幸的是,依赖构造函数抛出ClassNotFoundException
是不可靠的(尽管它现在可能适用于您的用例)。
我使用Class.forName
加载类以获得更可靠的行为(同时使用更多的Java-ish名称):
class DBusManager {
static SomeInterface getDBus() {
try {
return Class.forName("your.pkg.RealDBus")
.getConstructor()
.newInstance();
} catch(ClassNotFoundException e) {
return new FakeDBus();
}
}
}
答案 1 :(得分:1)
为什么这么难?只需为每个平台维护一个单独的jar文件。它使依赖关系变得更好,易于单独维护,使用新实现扩展等等......
windows-dbus.jar
|
+- class DBus implements SomeInterface { fake code }
linux-dbus.jar
|
+- class DBus implements SomeInterface { real dbus code }
根据您所使用的平台,在类路径中包含相应的jar。并在程序中请求一个新的DBus实例。
final SomeInterface bus = new DBus();
如果您的程序随WebStart一起发布,您甚至可以提到什么jar指向哪个平台。