6

スクリプトを使用していくつかの機能を実行できるように、swing を使用する Java プログラムに dbus 関数を追加することを考えています。このことは、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

残念ながら、コンストラクターに頼ってClassNotFoundExceptions をスローするのはやや信頼できません (ただし、現在のユースケースでは機能する可能性があります)。

より信頼性の高い動作を使用してクラスをロードしClass.forNameます(同時に、より多くのJavaっぽい名前を使用します;):

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 に答える