2013-04-22 16 views
1

我有一個快速的Java問題。哦,我相當新的Java和計算器,所以請體諒:)如何根據java中的屬性文件調用單例類的實例?

讓我試着解釋我的問題好一點。所以我必須遵循一個單例模式,說兩個類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(); 
} 

什麼我想實現的是這個(語法可能是完全錯誤的,在這一點上,我一直在嘗試不同的事情,他們沒有工作對我來說):如下

有一個屬性文件:

className=A 

然後以某種方式讀取從屬性文件中的類名,這樣,當我改變A到B,我testClassC會讓我B.

的實例,我怎樣才能做到這一點?哦,再次testClassC是一個測試類,我有一大堆的JUnit測試類,那麼最好的方法是什麼?

謝謝

+0

你想要它有多靈活?如果你不太在乎它的靈活性,你可以創建一個Map 來存儲該類的名字以及該類的單例。 – 2013-04-22 22:28:00

+0

@RobWatts我在哪裏存儲該Map對象?基本上我有三種類型的存儲類:RAM,XML和SQL。然後我有測試我的存儲的測試課程。我想要做的是有一個屬性文件,我可以將我的類名更改爲RAM,然後我的測試類將創建一個RAM存儲類實例,並對其進行測試。 – Bahrom 2013-04-22 22:31:54

+0

你應該閱讀依賴注入,因爲這正是你正在尋找的。這是一篇關於Spring DI的文章(http://www.vogella.com/articles/SpringDependencyInjection/article.html)。你應該仔細閱讀它,特別是第6章。 – maba 2013-04-22 23:21:18

回答

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); 
     } 
    } 
} 

所以你的工廠實現將遵循這種模式,但你可以,例如,緩存值使其成爲一個單例。

該方法從類路徑加載屬性文件 - 顯然這可以更改爲文件系統位置。

+0

非常感謝! – Bahrom 2013-04-23 01:10:47

+0

感謝所有其他的響應者,是的,我會閱讀依賴注入。我們在速成班中簡要介紹了它,但從未真正強調過。我想我會很快發現它的作用。 – Bahrom 2013-04-23 01:12:51