2009-09-29 25 views
3

1)有Somelib其在SomeProject加入作爲Java庫架構

2)在SomeProject存在somePackage.SomeClass它實現SomeLib.SomeInterface

3)SomeLib必須能夠在不每次

建設SomeLib創建somePackage.SomeClass情況下怎麼可能不使用反射?這是不可能寫在SomeLib東西像進口somePackage.Someclass

我正在使用Netbeans。

PS我是Java新手,我試圖儘可能清楚。

回答

3

你只可以添加一個硬編碼的依賴,但是你應該避免不惜一切代價,如果你正在計劃重新使用你的庫(即使你不這樣做)

而是使用這種模式:

  1. 創建用於在庫中創建SomeInterface實現。 (有關更多信息,請參閱Factory method pattern

  2. SomeProject中,您必須在該工廠註冊SomeClass。你可以使用一個靜態的初始化程序與Class.forName相結合。

    public class SomeClass { 
        static { 
         SomeFactory.registerSomeImplementation(SomeClass.class) 
        } 
    } 
    
    Class.forName("somePackage.SomeClass") // Alternative 1 
    SomeClass.class.getName();    // Alternative 2 
    

    這兩種方法都加載類並運行靜態初始化程序,但第二種方法提供了一些更好的重構機會。 不要與Class.forName混淆:其他答案建議使用它在中創建SomeClass實例。但是在這裏,您可以在項目中使用它來加載類,從而運行靜態初始化程序。

  3. SomeLib然後可以使用工廠爲SomeInterface創建一個實例。

    SomeInterface si = SomeFactory.createSomeObject(); 
    
+0

你也可以使用一個原型,根據生命週期 – wds 2009-09-29 09:32:20

1

你可以嘗試實例化這個類:

Class.forName("com.bla.yourclass").newInstance(); 
+1

是的,但在過量用藥的情況下,SomeLib不會知道SomeInterface實現者的姓名(鬆耦合) – 2009-09-29 08:10:16

0

我想聲明的類,實現在classpath中的平面文件(或Java屬性或XML),你的界面。你的庫可以查找文件,讀取類名和創建實例。我認爲,這是一種典型的方法。

然後,您不需要反射來搜索實現器的類路徑,而只需要調用來創建實例。