[英]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.