在java中使用带有模式构建器的枚举

时间:2016-07-21 08:41:39

标签: java design-patterns enums

我试图学习如何使用模式构建器。我可以让它工作,直到我试图使用枚举。

我尝试多次更改代码,每次都有不同的错误。现在错误是不兼容的类型。

请帮助您将此代码置于工作状态,如果您有改进代码的建议,那就太棒了。

感谢。

编辑: 现在似乎还可以,但是如何将它与主要内部的构建器一起使用? 这是我使用的代码

主:

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 个答案:

答案 0 :(得分:1)

不要在构建器中定义另一个@foreach($details as $detail) <detail> <h2> <a href="/details/{{$detail->Food_id}}">{{$detail->FoodName}}</a> </h2> // food photo <p><img src="{{ asset('uploads/'.$detail->image) }}" /><p> </detail> @endforeach 枚举:重用Status类中定义的那个。

否则,您必须从Person的实例映射到PersonBuilder.Status的实例:它们是完全不同的类型。

目前这种映射很简单:您可以使用Person.Status - 但您必须确保同时更新两者以具有相同的值(或至少Person.Status.valueOf(personBuilderStatus.name())映射到子集的PersonBuilder.Status Person.Status),这是一个不必要的维护负担。