2016-03-13 52 views
0

今天我遇到了構圖。據我瞭解,爲各自組成比如我需要構造函數來創建新的對象,像這樣:Java構圖 - 構造函數

public class Human { 
    private String name; 
    private Adress adress; 

    public Human (String name, Adress adress) { 
     this.name = name; 
     this.adress = new Adress(adress); 
    } 
} 

所以,如果我想創建一流的人力的新實例,我需要分配給它的一些實例的地址,或創建全新的地址,構造函數看起來像這樣

public class Human { 
    private String name; 
    private Adress adress; 

    public Human (String name, String city, String country) { 
     this.name = name; 
     this.adress = new Adress(city, country); 
    } 
} 

首先,這些代碼是否正確?還有什麼選擇,如果我要創建類人類的新實例,屬性地址將是空的,我可以稍後使用set方法設置它? 非常感謝您的回覆。

回答

0

一個新的對象通常不是強制性的,但是,如果你想擁有人類不可變的地址(只有當Adress已經不是不變的時候),最好從外部去除所有對它的引用目的。

這確實是作曲的規則。

如果地址在其構造函數中使用地址作爲輸入,這自然就是這樣做的。

public class Human { 
    private String name; 
    private Adress adress; 

    public Human (String name, Adress adress) { 
     this.name = name; 
     this.adress = new Adress(adress); 
    } 
} 

如果你願意,你可以有一組不同的構造函數,並設置一些字段後

public class Human { 
    private String name; 
    private Adress adress; 

    public Human() {} 
    public Human(String name){ 
     this.name = name; 
    } 
    public Human(String name, Adress adress) { 
     this.name = name; 
     this.adress = adress; // or new Adress(adress) 
    } 

    public void setAdress (Adress adress) { 
     this.adress = adress; 
    } 
} 
+1

只有'地址'不是不可變的。否則,不需要複製它。 –

+0

@AndyTurner謝謝安迪,糾正它。 –

+0

我應該抗議事實,你的答案的下半部分*直接從我的抄襲* – Idos

0

如果我理解你的問題正確,那麼你正在尋找一個default constructorgetter-setters用於名稱和地址。

這裏是代碼片段:

public class Human { 

    private String name; 
    private Address address; 

    /* Default Constructor */ 
    public Human() {} 

    public Human(String name, Address address) { 
     this.name = name; 
     this.address = new Address(address); 
    } 

    /* Getter for Name */ 
    public String getName() { 
     return this.name; 
    } 

    /* Setter for Name */ 
    public void setName(String name) { 
     return this.name = name; 
    } 

    /* Getter for Address */ 
    public Address getAddress() { 
     return this.address; 
    } 

    /* Setter for Address */ 
    public void setAddress(Address address) { 
     return this.address = address; 
    } 
} 

現在,你可以很容易地通過這樣做Human類的新對象:

Human h = new Human(); 

,以後再設置名稱或地址,如下所示:

h.setName("foo"); 
h.setAddress(new Address("foo","bar")); 

請注意,我修復了錯字adress

0

兩者都是正確的。

Hovever我更喜歡第一個,因爲你的工作與你的類地址一樣,也包含在Human類中。

public class Human { 
    private String name; 
    private Adress adress; 

    public Human (String name, Adress adress) { 
     this.name = name; 
    this.adress = new Adress(adress); 
    } 
} 
0

首先,是那些代碼是否正確?

你是什麼意思?它爲你編譯?如果是的話,他們是(不是真的,但至少在這個意義上)。

是否有任何選擇,如果我要創建類人類的新實例,屬性Address將是空的,我可以稍後使用set方法設置它?

是的,你可以通過多種方式實現這一目標,其中之一是通過添加適當的構造:

public Human (String name) {  
    this.name = name; 
} 

並添加setter

private void setAddress(Adress adress) {  
    this.adress = adress;  
} 
+0

「_它是否爲你編譯?如果是這樣,那麼他們是._」 - 真棒。這個理論幾乎從來沒有爲我工作... –

+1

試圖強調,這些短語*是那些代碼正確*不僅在語法上不正確,而且一般毫無意義。 – Idos

0

您可以創建一個新的Human物體與Address參數設置爲null

Human human = new Human("My Name", null, null); 

但是如果兩者(或其中之一)都是null,那麼您將必須檢查這些參數並將其設置爲addressnull

或者你可以在Human類中定義一個新的構造:

public Human(String name) { 
    this.name = name; 
    /* The line below is not required, since objects are set to null by default*/ 
    this.address = null; 
} 

而且你可以創建一個setter方法,它允許更改地址只有地址是null本身,或地址參數null。也就是說,如果這就是你想要的。
這裏是下面一個例子:

public void setAddress(Address address) { 
    if (this.address == null) { 
     this.address = address; 
    } 
} 
0

Address通常遠不止此:街道1,街道2,城市,州,縣,郵政編碼,郵政編碼延伸,國家,緯度/經度,等我會認爲你的例子不足。

對象在構建時應該100%準備好。您可以重載構造函數或提供一個構建器以使其更便利。

此規則的一個例外是與Jackson的JSON序列化。對於所有序列化的私有數據成員,它需要一個無參數構造函數和getter/setter對,因爲它使用反射和Java Bean約定。

沒有正確或錯誤,正確或不正確。在提高可讀性,清晰度,易用性和更改以及維護DRY的同時,還有什麼適用於您的代碼。

還有一點建議:名字很重要。長時間思考它們。 Human真的嗎?除非你打算擁有非人類的替代品,否則我會說PersonIndividualCustomer或者你的上下文會是更好的選擇。

下面是另一個:Person可以有多個AddressResidence,Mailing,Shipping,Garaging等?你將如何處理?