1

我按照Java builder 模式创建了一个类,它对我来说效果很好,但是现在我发现自己需要更多的模块化。这可以在不废弃 Builder 的情况下完成吗?

例如,我想使用枚举的配置数组(或任何其他可以让我自定义字段顺序和选择的方法)来构建我的 Person 对象。这些值来自各种嵌套对象,我需要在特定时间以特定顺序创建特定字段来创建输出 CSV。

public static enum FIELDS = { FIRST, MIDDLE, LAST }

List<FIELDS> fields = { FIRST, LAST } creates:
Person person = new Person.builder().first("john").last("doe").build();

List<FIELDS> fields = { LAST, FIRST, MIDDLE } creates:
Person person = new Person.builder().last("doe").first("john").middle("q").build();

是否可以在枚举上执行任何类型的 switch 语句来动态构造 Person ?

4

2 回答 2

3

好吧,您可以做类似的事情;例如

   public Person list2Person(List<FIELDS> fields) {
       Builder builder = new Person.builder();
       for (Field field : fields) {
           switch (field) {
           case FIRST:
              builder.first(getValue(FIRST));
              break;
           case MIDDLE:
              builder.middle(getValue(MIDDLE));
              break;
           ...
           }
           return builder.build();
       }
   }

当然,这假设您有某种方法可以实现getValue(FIELDS).

于 2013-09-06T22:47:57.227 回答
0

这项工作应该在其内部完成enum,可能。您可以在主体中声明一个abstract方法,enum然后在每个Enum元素中覆盖它。

import java.util.Iterator;

public class Person {
  public static enum FIELDS {
    FIRST ("john") { protected void addString(PersonBuilder builder) { builder.first(getName()); } },
    MIDDLE ("q") { protected void addString(PersonBuilder builder) { builder.middle(getName()); } },
    LAST ("doe") { protected void addString(PersonBuilder builder) { builder.last(getName()); } };

    private String name;

    protected abstract void addString(PersonBuilder builder);

    private FIELDS(String name) {
      this.name = name;
    }

    protected String getName() {
      return name;
    }
  }

  public static class PersonBuilder {
    public PersonBuilder addIterable(Iterable<FIELDS> iter) {
      Iterator<FIELDS> it = iter.iterator();
      while(it.hasNext()) {
        it.next().addString(this);
      }

      return this;
    }

    // you wrote these already, this is just to make it compile
    public void first(String first) { }
    public void middle(String middle) { }
    public void last(String last) { }
  }
}
于 2013-09-06T22:44:39.163 回答