0

Jarファイルに格納されているクラスライブラリに関する情報にアクセスし、クラスライブラリごとにカスタマイズされたアクションを実行するクラスに取り組んでいます。Jarファイルからローカライズされた文字列などをロードするメソッドが含まれています。

public class CodeBundle {
    public static String str(String id) {
        ...
    }

    ...
}

情報をロードしようとしているライブラリを知る必要があるため、各ライブラリを表すサブクラスを使用できるようにします。次に例を示します。

public class JAppFramework extends CodeBundle {
    ...
}

したがって、JApp Frameworkの一部であるコードで、JAppFramework.str("...")JAppFrameworkリソースバンドルから文字列をロードするために呼び出すことができるようにしたいと思います。また、などの別のライブラリがある場合は、テストライブラリのリソースバンドルから文字列をロードするTestLibraryために呼び出すことができるようにしたいと思います。TestLibrary.str("...")私がしたことは、ライブラリがロードされたJarファイルを返すCodeBundle呼び出しで定義されたメソッドを持つことでした。getFile()次に、str()メソッドはそれを使用してローカライズされた文字列をロードします。

問題は、の静的メソッドはCodeBundle、クラスに格納されているデータにのみアクセスできCodeBundle、私が知る限り、そのサブクラスにはアクセスできないことです。

さまざまな理由で、「getClass()。getResource(name)」を使用してリソースをロードできません。

私がやろうとしていることをする方法はありますか?

4

1 に答える 1

1

シングルトンを試して使用することができます。

public abstract class CodeBundle { // or even an interface
    public abstract String str(String id);
}

public final class JAppFramework extends CodeBundle {
    private static final CodeBundle INSTANCE = new JAppFramework();

    // private constructor
    private JAppFramework() {
        // whatever
    }

    // get the instance
    public static CodeBundle getInstance() { return INSTANCE; }

    // Implement str() here
}

// Create other singletons as needed

あなたのコードでは:

CodeBundle bundle = JAppFramework.getInstance();
bundle.str(whatever);

もちろん、これは非常に単純な例です。必要なフィールド/メソッド/コンストラクター/コンストラクター引数を入力しますCodeBundle。これは抽象的であるため、インスタンス化できません。

于 2013-01-12T02:41:12.997 に答える