6

我正在考虑将 dbus 函数添加到使用 swing 的 java 程序中,因此可以使用脚本来执行某些功能。这个东西也必须在 dbus 不可用的 Windows 上运行。

所以我正在考虑做以下事情:

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();
        }
    }
}

你认为这是个好主意吗?它会起作用吗?有更好的方法吗?

4

2 回答 2

10

不幸的是,依靠构造函数来 throw ClassNotFoundExceptions 有点不可靠(尽管它现在可能适用于您的用例)。

我会使用Class.forName更可靠的行为加载类(同时使用更多Java-ish名称;):

class DBusManager {
    static SomeInterface getDBus() {
        try {
            return Class.forName("your.pkg.RealDBus")
                        .getConstructor()
                        .newInstance();
        } catch(ClassNotFoundException e) {
            return new FakeDBus();
        }
    }
}
于 2013-02-08T15:16:37.660 回答
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 用于哪个平台。

于 2013-02-08T15:30:22.133 回答