2012-05-24 70 views
3

我使用的是建造者模式的幾件事情(如約書亞布洛赫的Effective Java解釋),而且也涉及到一個特別討厭的重複:重複在Builder模式

public class Foo { 
    private String name; 
    private int age; 

    public static class Builder implements IBuilder { 
     private String name; 
     private int age; 

     Builder name(String value) { 
      name = value; 
      return this; 
     } 

     Builder age(int value) { 
      age = value; 
      return this; 
     } 

     Foo build() { 
      return new Foo(this); 
     } 
    } 

    private Foo(Builder builder) { 
     name = builder.name; 
     age = builder.age; 
    } 
} 

這是小,但惱人的。我必須在每個類中聲明變量。我試圖創建一個類與字段和擴展該類,但我得到的錯誤:{variable_name} has private access in {class_name}

有沒有辦法做到這一點,而不公開變量?

+0

爲什麼不使用'protected'而不是'private'來處理這些變量? – Matzi

+6

這甚至不是Builder模式。構建器模式不會將構建器作爲參數傳遞給構造函數。 –

回答

0

如果您的構建器純粹是爲了捕獲一堆狀態(而不是執行任何中間計算),您可以通過定義構建器接口,然後編寫Java代理生成器來解決重複問題。

如果你這樣做,你不能依賴外部類訪問構建器(內部)類的私有字段。要解決該問題,您還需要爲每個字段定義訪問器。因此,例如:

public class Foo { 
    public interface Builder extends IBuilder { 
    Builder name(String name); 
    String name(); 

    Builder age(int age); 
    int age(); 
    ... 
    } 

    public static Builder builder() { 
    return BuilderFramework.newInstance(Builder.class); 
    } 

    public Foo(Builder builder) { 
    ... 
    } 
} 

或者,你的建設者會暴露在Map或類似結構中的所有領域。使用該路線,您的界面只需要鏈接設置器。但是你放棄編譯時檢查構造函數中所有的字段用法。恕我直言,太大的妥協。

+0

downvote沒有解釋? –