1

Javaについて簡単な質問があります。ああ、私はJavaとstackoverflowの両方にかなり慣れていないので、気をつけてください:)

私の質問をもう少しうまく説明してみましょう。したがって、クラス A とクラス B など、シングルトン パターンに従う 2 つのクラスがあります。

public class A
{
    private static final A INSTANCE = new A()

    public static A getInstance()
    {
         return A.INSTANCE;
    }
}

public class B
{
    private static final B INSTANCE = new B()

    public static B getInstance()
    {
         return B.INSTANCE;
    }
}

今、私は別のクラスからこれらのクラスのインスタンスにアクセスしています.Cとしましょう:

public class testClassC
{
    A class_instance = A.getInstance();
    //or
    //B class_instance = B.getInstance();
}

私が達成しようとしているのはこれです(この時点で構文が完全に間違っている可能性があります。さまざまなことを試してみましたが、どれもうまくいきませんでした):

次のような .properties ファイルを用意します。

 className=A

そして、何らかの方法でそのプロパティ ファイルからクラス名を読み取り、A を B に変更すると、testClassC が B のインスタンスを取得するようにします。

どうすればこれを達成できますか?繰り返しになりますが、testClassC はテスト クラスであり、JUnit テスト クラスがたくさんあるので、これにアプローチする最善の方法は何でしょうか?

ありがとうございました

4

1 に答える 1

2

以下は、抽象ファクトリ パターンを使用した例です。

クラスを定義するがinterfaceあります。これは、実際の実装を抽象化できるようにするために必要です。

次に、メソッドを定義するファクトリ インターフェイスを作成しますnewInstance。これにより、シングルトン パターンをファクトリ パターンに簡単に交換できます。また、テストのためにファクトリの実装を簡単に変更することもできます。

interface MyInterface {
}

interface MyInterfaceFactory {

    MyInterface newInstance();
}

class MyInterfaceFactoryFromProperties implements MyInterfaceFactory {

    final Class<? extends MyInterface> myInterfaceImpl;

    {
        final Properties properties = new Properties();
        try {
            properties.load(MyInterfaceFactoryFromProperties.class.getResourceAsStream("className.properties"));
        } catch (IOException ex) {
            throw new ExceptionInInitializerError(ex);
        }
        final String className = properties.getProperty("class.name");
        try {
            myInterfaceImpl = (Class<? extends MyInterface>) MyInterfaceFactoryFromProperties.class.forName(className);
        } catch (ClassNotFoundException ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    @Override
    public MyInterface newInstance() {
        try {
            return myInterfaceImpl.newInstance();
        } catch (InstantiationException ex) {
            throw new RuntimeException(ex);
        } catch (IllegalAccessException ex) {
            throw new RuntimeException(ex);
        }
    }
}

したがって、ファクトリの実装はこのパターンに従いますが、たとえば、値をキャッシュしてシングルトンにすることができます。

このメソッドは、クラスパスからプロパティ ファイルをロードします。明らかに、これはファイル システムの場所に変更できます。

于 2013-04-22T22:42:45.193 に答える