1. 程式人生 > >Effective Java——02 構建器

Effective Java——02 構建器

前言:當想建立物件的時候,我們有很多種辦法,那麼當有大量初始化引數的時候,該如何選擇才能比較好呢。

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、構建方法比較冗長