2011-03-13 27 views
3

查詢假設我有這樣一個對象:我應該添加一個方法/構造函數的參數爲​​,可以從另一種說法

public class A { 
    private B b; 

    public B getB() { 
    return b; 
    } 
} 

現在,我有一個需要A和B是問題的一類,如果構造函數只接受A,然後我會從A中查詢B,或者構造函數是否要求A B?

它應該是這樣的:

public MyClass(A a) { 
    this.a = a; 
    this.b = a.getB(); 
} 

或本:

public MyClass(A a, B b) { 
    this.a = a; 
    this.b = b; 
} 

P/S:我覺得這是一個相當noobish問題,但不管。

p/p/s:認爲這應該是一個社區維基?雖然我沒有足夠的權限。 :/

回答

2

我認爲這是一個很好的問題!因爲好的做法存在「矛盾」。

第一個解決方案適用規則:「嘗試的參數數最少傳遞給方法(或構造)」(羅伯特·Ç馬丁提到在他的書中清潔守則此規則)

第二個片段如下規則Law of Demeter,這說明MyClass應該儘可能少地瞭解A.

就我個人而言,我會選擇第二個選項,但在某些情況下,我可能會選擇第一個選項。

+0

你完全用德米特定律釘住了我的困境。我也不想讓我的構造函數「撒謊」(說我需要A,當我還需要B時)...... – yihtserns 2011-03-20 07:37:46

1

第二選項允許用戶調用MyClass的與非關聯B:

new MyClass(new A(),new B()); 

而第一選項確保MyClass的使用相同的乙...
所以它是你的需要這是首選。

0

這取決於,如果你有像下面這樣的東西,它會讓Car僅僅把Engine作爲構造函數的參數,因爲它使得sence說engine.getEngineParts()

class Car 
class Engine 
class EnginePart 

如果合同較弱,我會建議使用setter注入和使用默認的構造函數。

如果按如下方式創建構造函數,則無法確定EnginePart實際上是否屬於Engine。這可能是對的場合理想的,雖然,例如,當你想添加一個EnginePartEngine,例如,

EngineAssembler (Engine engine, EnginePart part) { 
    engine.addPart(part); 
} 
0

這取決於問題。 這取決於A和B是什麼。

無論如何,我選擇的構造與A作爲參數(即使你的問題太普通)

0

最好的方法是當你製作對象A時,通過setter或構造函數設置B的值,並將A對象傳遞給新類。

public class MyClass{ 
    A a; 
    Myclass(A a){ 
    this.a = a; 
} 

public void doSomething() 
{ 
System.out.println(a.getB()); 
} 
} 

MyClass總是可以只使用一個實例變量。因爲你總是可以用a.getB()獲得B.如果B不能爲空,確保你檢查B的空值,當它在它上面運行時。

1

在類A和類B可能被子類化的情況下,在MyClass中總是使用對應於正在使用的特定A子類的B子類可能非常重要。如果B實例需要針對特定​​的A實例正確配置,則即使沒有子類化,也會有類似的考慮。在類A的定義中添加getB()方法是幾種設計模式的組成部分,這些模式有助於滿足此類要求。在這些情況下,MyClass的構造函數應該只取A的一個實例並從A中檢索正確的B實例。

如果MyClass可以針對任何特定的A實例使用一系列B實例,那麼雙參數構造函數更有意義。這將生成一個B實例的責任轉移到任何特定的A實例,以便創建MyClass實例的客戶端類。這對於各種混搭類型的結構來說可能是正確的解決方案。但這一切都引出了一個問題:爲什麼A類首先有一個getB()方法?

0

是否有可能根本不傳遞B,而是隻要需要B執行某些操作就讓MyClass與A交談?

相關問題