2010-10-14 29 views
2

我剛剛開始學習Java,並且正在努力尋找實現以下方法的正確方法。什麼OOP概念處理以下情況?

我有一個叫State的類。這個類有一個叫做stateCaptial的字段。

我創建一個狀態對象。

然後我想要創建很多與一個State對象相關的Town對象,如果我查詢它的州會城市,它應該從狀態對象中獲取它。我認爲這會被歸爲一對多關係?

實施此類解決方案的Java術語是什麼?

非常感謝 安迪

回答

1

您也可以創建一個Town類。因此,國家有一個叫做城鎮資本的領域。國家也有一套「鎮」,以便所有的城鎮都可以被看作是一個國家。小鎮有一個田野狀態的州。像下面的東西。

State類:

public class State { 

    private Town capital; 
    private Set<Town> towns; 

    public State() { 
     this.towns = new HashSet(); 
    } 

    public State(Town capital) { 
     this.capital = captial; 
     this.towns = newHashSet(); 
     this.towns.add(capital) 
    } 


    public void setCapital(Town capital) { 
     this.captial = capital; 
    } 

    public Town getCapital() { 
     return this.capital; 
    } 

    public void addTown(Town town) { 
     this.towns.add(town) 
    } 

    public Set getTowns() { 
     return this.towns; 
    } 
} 

鎮類:

public class Town { 

    private State state; 

    public Town() {} 

    public Town(State state) { 
     this.state = state; 
     this.state.addTown(this); 
    } 

    public void setState(State state) { 
     this.state = state; 
     this.state.addTown(this); 
    } 

    public State getState() { 
     return this.state; 
    } 
} 

然後,如果你有一個Town對象調用myTown,拿到鎮上的州首府你使用:

myTown.getState().getCapital();

如果您有State對象調用myState,你得到所有城鎮的使用:

myState.getTowns();

+0

Town.getState()的接口是否正確? – Huperniketes 2010-10-14 19:20:49

+0

@Huperniketes不是 - 它不是。複製並粘貼FAIL。我現在更新了它。 Town.getState()返回類型應該是狀態。 – Owen 2010-10-14 19:35:38

+0

我喜歡它!這似乎是最深入的答案。其他一些人提到Dependancy注射劑,這種解決方案是DI的一種形式嗎?我最終想要將所有對象粘貼在數據庫中。我試着從頭開始正確的方式 - 如果你知道我的意思。 – AndyM 2010-10-18 18:45:24

0

爲什麼不在城鎮的狀態數組,每個指回他們的狀態?

1

這將是一對多的關係。

做到這一點的最好方法是讓每個Town對象都有一個指向它所屬狀態的狀態字段。然後,Town的getStateCapital方法將從狀態中獲得stateCapital並返回。

您可能還希望在狀態對象上有一個數組或城鎮對象列表,以便您可以列出一個州內的所有城鎮。

1

您所描述的是您希望Town對象依賴於State對象。將依賴對象插入Town類的行爲通常稱爲依賴注入或DI。

你將不得不與此類似

public class Town 
{  
    private State _state; 

    public Town(State state) 
    {   
     _state = state;   
    }  

    public string StateCapital() 
    {   
     return _state.Capital; 
    }  

} 
+0

我D可能已經使用屬性而不是方法來獲得狀態資本,但我不記得Java屬性和C#屬性了。 – 2010-10-14 15:08:39

+0

這只是一個單向關係的小警告 - 他可能不僅希望通過「城鎮」找到一個「國家」,而且還要通過「國家」內的所有「城鎮」。 – mway 2010-10-14 15:09:59

+0

你可以使它成爲一個雙向關聯是的,但是我總是發現雙向關聯的工作非常複雜,並且通常會改變關係使其成爲單向的,並且如果實際需要的話提供替代方式來達到關係的互補側。很多時候雙向關聯屬於YAGNI(你不需要它) – 2010-10-14 15:39:29

0

類結構你應該看看封裝,抽象和繼承的可能。

您應該嘗試將您創建的每個對象都視爲封裝與其直接相關的數據,並提供訪問和操作該數據的方法。

對於這個問題,您可以創建兩個類State和Town。

您的州級班級將有一個名爲Capital的會員,該會員將會輸入城鎮 和名爲Towns的列表,其中包含城鎮中的所有城鎮。鎮上會有一個叫做州的成員。

0

從一個角度OOP的一點,那就是要正確執行。我將使用C#語法,因爲我熟悉它,但它不應該與java差別太大。

public class State 
{ 
public string Name {get;set;} 
public ICollection<City> Cities {get;set;} //Access to all child cities 
} 

public class City 
{ 
public string Name {get;set;} 
public string State_Name {get;set;} //this is sort of a FK 
public State State {get;set;} //Direct access to the State object related 
} 

你可以從市級省略串STATE_NAME,你可以達到使用city.State.Name相同的屬性;無論如何,爲了某些目的,可以非常方便地將「FK」直接放在兒童班上。當然,在這種情況下,您應該有確保FK保持與State對象同步的代碼。如果使用這些類,比方說,通過ORM框架,通常會自動處理這些類。

+1

這是真的java代碼?這與C#無法區分。 – 2010-10-14 15:41:06

+1

-1 java問題上的C# – bwawok 2010-10-14 15:54:14

+2

@bwawok噢,我的天啊,人們真的可以那麼密嗎?我猜是這樣。語法真的很重要嗎?這是重要的概念。我明確指出我會使用c#語法,因爲我熟悉它。我可以爲此編寫僞代碼,這個概念適用於任何語言。但我想你是那種「特定語言」的粉絲之一,他們貶低任何提及不同於他們心愛的語言的人。我*想* stackoverflow有一個成熟的人的社區,但我顯然是錯的。 – 2010-10-14 15:57:12

1

這是我的想法。的關係是一對多(國城)這樣表示此代碼會是這個樣子:

public class State { 
    private Set<Town> towns; 

    public State() { 
     // default constructor 
    } 

    public State(Set<Town> towns) { 
     this.towns = towns; 
    } 

    public void createTown(Town town) { 
     towns.add(town); 
    } 
} 

目前全鎮類可以是這個樣子:

public class Town { 
    private State state; 
    private boolean isCapital; 

    public Town() { 
     // default constructor 
    } 

    public Town(State state) { 
     this.state = state; 
    } 

    public void setCapital(boolean isCapital) { 
     this.isCapital = isCapital; 
    } 
}