轉載注明出處 https://www.cnblogs.com/rolayblog/p/10552085.html
背景
由.net轉戰java,發現在C#語法中,我們新建一個對象賦值時經常這樣寫:
1 Person person=new Person(){ 2 age=1, 3 name="Rolay", 4 ...................... 5 }
看起很美觀,並且會提示我們哪些賦值了,哪些沒有賦值。但是在java中沒有看到這樣的寫法,於是近期的寫法全都是這樣:
1 Person person=new Person(); 2 person.age=11; 3 person.name="Rolay'; 4 .................................
這種寫法確實也能滿足需求,但是屬性一旦多了,或者其中有些限制必填或非必填時,很容易看錯或者寫掉。在讀effective java中看到builder模式對於創建對象的使用示例,順便記錄下來別讓自己忘了。
正文
1 public class Person { 2 private final String name; 3 private final String gender; 4 private String house; 5 private String age; 6 private String hight; 7 private Integer money; 8 9 public Person(Builder builder) 10 { 11 this.name=builder.name; 12 this.gender=builder.gender; 13 } 14 @Override 15 public String toString() 16 { 17 return "姓名:"+this.name+",性別:"+this.gender; 18 } 19 public static class Builder{ 20 private final String name; 21 private final String gender; 22 private String house; 23 private String age; 24 private String hight; 25 private Integer money; 26 public Builder(String name,String gender){ 27 this.name=name; 28 this.gender=gender; 29 } 30 public Builder house(String house) 31 { 32 this.house=house; 33 return this; 34 } 35 public Builder hight(String hight) 36 { 37 this.hight=hight; 38 return this; 39 } 40 public Builder money(Integer money) 41 { 42 this.money=money; 43 return this; 44 } 45 public Person build() 46 { 47 return new Person(this); 48 } 49 } 50 }
在Person類中定義一個內部類Builder,這個Builder內部類中的屬性要和Person中的相同,並且必須有的屬性要用final修飾,防止這些屬性沒有被賦值。然后內部類中定義了一個構造方法,傳入必須有的屬性。其他非必須的屬性都通過方法設置,每個方法都返回Builder對象自身。最后定義了一個build方法,將Builder對象傳入Person的私有構造方法,最終返回一個對象。重寫toString 返回兩個必填項組成的字符串。下面是調用示例:
1 Person person=new Person.Builder("張三","男") 2 .hight("1.80").house("big house").money(1000000).build(); 3 System.out.println(person.toString());
