2016-07-21 50 views
-1

即時通訊嘗試學習如何使用模式構建器。我可以讓它工作,直到我試圖使用枚舉。在java中使用枚舉與模式生成器

我試圖改變代碼幾次,每次都有不同的錯誤。現在錯誤是不兼容的類型。

請你幫忙把這段代碼帶到工作狀態,如果你有改進代碼的建議,那將會很棒。

謝謝。

編輯: 現在它似乎是好的,但我如何使用它與主內的生成器? 這是我用

主要代碼:

Person person3 = new Person.PersonBuilder("Julliete", "Kaplan") 
      .status(); // what should i write here to set the status? 

人類

public class Person 
{ 
private final String name; 
private final String lastname; 
private final int age; 

//My enum im trying to use 
private Status status; 
public enum Status 
{ 
    SINGLE ("Single"), MARRIED ("Married"), WIDOWER ("Widower"); 

    private String status; 

    private Status(String status) 
    { 
     this.status = status; 
    } 

    public String getStatus() 
    { 
     return this.status; 
    } 
} 

//builder 
private Person(PersonBuilder builder) { 
    this.name = builder.name; 
    this.lastname = builder.lastname; 
    this.age = builder.age; 
    this.status = builder.status; 
} 

//GETTERS 
public String getName() { 
    return name; 
} 

public String getLastname() { 
    return lastname; 
} 

public int getAge() { 
    return age; 
} 

@Override 
public String toString() { 
    return "Person : "+this.name+", "+this.lastname+", "+this.age; 
} 

//PersonBuilder 
public static class PersonBuilder 
{ 
    private final String name; 
    private final String lastname; 
    private int age; 
    private Status status; 

    public PersonBuilder(String name, String lastname) { 
     this.name = name; 
     this.lastname = lastname; 
    } 

    public PersonBuilder age(int age) { 
     this.age = age; 
     return this; 
    } 

    public PersonBuilder status(Status status) 
    { 
     this.status = status; 
     return this; 
    } 

    public Person build() { 
     Person person = new Person(this); 
     return person; 
    } 

} 
+1

是什麼原因爲什麼你的枚舉是私人的?如果將它保留爲公共,Person和PersonBuilder可以共享它 – user902383

+0

雖然PersonName中的枚舉具有相同的名稱和內容,但它與PersonBuilder中的枚舉不同,它的枚舉類型是一個**不同的枚舉。 – Jesper

+0

在風格上,我會簡單地調用'PersonBuilder'類'Builder':你可能知道它構建了一個'Person',它在這個類中。 –

回答

1

不要定義生成器內的另一個Status枚舉:重用在Person類中定義的一個。否則,你必須從PersonBuilder.Status的實例映射到Person.Status的實例:它們是完全獨立的類型。

目前這個映射是簡單的:可以使用Person.Status.valueOf(personBuilderStatus.name()) - 但你必須確保你在同一時間(至少PersonBuilder.Status地圖或到的Person.Status一個子集)更新兩個具有相同的值,這是不必要的維護負擔在前進。