2013-06-12 48 views
0

如果我有下面的類,Foo,其中Bar也是一類:如何在Java中初始化聚合和組合的類字段?

public class Foo { 
    private Bar baz; 

    public Foo() { 
    } 
} 

上午我就在想,如果我初始化baz在聲明我將有FooBar之間的聚合關係如果我在Foo的構造函數中初始化了baz,我將會有一個複合關係?就像這樣:

骨料(我想這大概是不正確的?):

public class Foo { 
    private Bar baz = new Bar(); 

    public Foo() { 
    } 
} 

複合:

public class Foo { 
    public Foo() { 
     baz = new Bar(); 
    } 
} 

我有點新的Java,看到作爲一切都是一流的,我很難想象如何(特別是)整體關係的工作,除非我做出bazstatic。如果我在其他地方創建了baz並將它傳遞給Foo的構造函數,那麼baz是不是隻是其他類的組合?位困惑。

回答

1

嘗試閱讀更多關於dependency injection。這是你在最後一句話中描述的。它的一個模式可以消除硬編碼的依賴關係,就像你在這兩個例子中一樣,但是這個工作被委託給一個更高級的權限。

你會得到這樣的:

public class Foo { 

    private Bar baz; 

    public Foo(Bar baz) { 
     this.baz= baz; 
    } 
} 

巴茲的實際實例可以在編譯和運行時改變。

實際的構圖意味着類Bar沒有類Foo沒有意義(或值),並且沒有Foo就不能存在, - Bar「是Foo的一部分。一個例子是:IMEI號碼是電話的一部分。

彙總告訴Foo只擁有酒吧, - 酒吧「有」Foo。一個例子是:電池是手機的一部分。其他不是手機的設備也可以有電池。

這兩個概念與您編寫代碼的方式沒有多大關係。

0

組成

final class Car{ 

    private final Engine engine; 

    Car(EngineSpecs specs) { 
    engine = new Engine(specs); 
    } 

    void move() { 
    engine.work(); 
    } 
} 

聚集

final class Car { 

    private Engine engine; 

    void setEngine(Engine engine) { 
    this.engine = engine; 
    } 

    void move() { 
    if (engine != null) 
     engine.work(); 
    } 
} 
+0

好吧,這是有道理的,但是對於'bar'作爲一個複合*最終*在綜合情況下我的評論怎麼樣? –