Effective Java——02 構建器
阿新 • • 發佈:2018-11-07
前言:當想建立物件的時候,我們有很多種辦法,那麼當有大量初始化引數的時候,該如何選擇才能比較好呢。
1.重疊構造器模式
首先來看看重疊構造器的實現,相信大家都寫過類似程式碼:
public class Person { private String head; private String hand; private String foot; public Person(){} public Person(String head){ } private Person(String head,String hand){ this.head = head; this.hand = hand; } }
呼叫:
new Person("頭","兩隻手");
書中闡述了這種模式的問題在於,引數過多的情況下,構造器函式也會急劇上增,帶來的後果會是客戶端程式碼很難編寫,並且難以閱讀。
2.JavaBeans模式
public class Person { private String head; private String hand; private String foot; public String getHead() { return head; } public String getHand() { return hand; } public String getFoot() { return foot; } public void setHead(String head) { this.head = head; } public void setHand(String hand) { this.hand = hand; } public void setFoot(String foot) { this.foot = foot; } }
呼叫:
Person p = new Person();
p.setHead("頭");
p.getHand("兩隻手");
優點:這種模式彌補了重疊構造器模式的不足,建立例項容易,程式碼讀起來也很容易。
缺點: 1.構造過程被分到了幾個呼叫當中,在構造過程中JavaBean可能處於不一致狀態。
2.JavaBean模式阻止了把類做成不可變的可能,這就需要程式設計師額外保障他的執行緒安全。
3.構建器模式
public class Person { private String head; private String hand; private String foot; public void setHead(String head) { this.head = head; } public void setHand(String hand) { this.hand = hand; } public void setFoot(String foot) { this.foot = foot; } public static class Builder{ private final String head; private String hand; private String foot; //可強制必須有的屬性 public Builder(String head){ this.head = head; } public Builder buildHand(String hand) { this.hand = hand; return Builder.this; } public Builder buildFoot(String foot) { this.foot = foot; return Builder.this; } public Person build(){ return new Person(this); } } private Person(Builder builder){ this.head = builder.head; this.hand = builder.hand; this.foot = builder.foot; } }
呼叫:
Person p = new Person.Builder("頭腦風暴").buildHand("手").build();
優點:既能保障像重疊構造器的安全性,又能保證像JavaBean那樣的可讀性。
缺點:1、增加建立構建器的開銷。
2、構建方法比較冗長