簡體   English   中英

如何在Java中基於屬性文件調用單例類的實例?

[英]How can I call an instance of a singleton class based on a properties file in java?

我有一個快速的Java問題。 哦,我對Java和stackoverflow還是很陌生,所以請體諒:)

讓我嘗試更好地解釋我的問題。 因此,我有兩個遵循單例模式的類,即A類和B類:

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測試類,那么解決這個問題的最佳方法是什么?

謝謝

這是一個使用抽象工廠模式的示例。

您有一個定義類的interface -需要此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);
        }
    }
}

因此,您的工廠實現將遵循這種模式,但是例如,您可以緩存該值以使其成為單例。

此方法從類路徑加載屬性文件-顯然可以將其更改為文件系統位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM