与吸气剂/安装员的建造者样式

时间:2014-04-05 00:14:26

标签: java design-patterns

我想以joshua bloch的方式实现构建器模式,但我也使用jackson的objectMapper将一个对象转换为另一个对象,内部使用setter方法设置值。

将这两种课程都安排在一个班级是不错的做法?如果不是,我怎样才能实现两全其美?

3 个答案:

答案 0 :(得分:2)

我从未尝试过这个,但显然杰克逊2.x支持构建器模式

http://wiki.fasterxml.com/JacksonFeatureBuilderPattern

@JsonDeserialize(builder=ValueBuilder.class)
public class Value {
  private final int x, y;
  protected Value(int x, int y) {
    this.x = x;
    this.y = y;
  }
}

public class ValueBuilder {
  private int x, y;

  // can use @JsonCreator to use non-default ctor, inject values etc
  public ValueBuilder() { }

  // if name is "withXxx", works as is: otherwise use @JsonProperty("x") or @JsonSetter("x")!
  public ValueBuilder withX(int x) {
    this.x = x;
    return this; // or, construct new instance, return that
  }
  public ValueBuilder withY(int y) {
    this.y = y;
    return this;
  }

  public Value build() {
    return new Value(x, y);
  }
}

答案 1 :(得分:1)

这两种结构都有不同的用途。

  • 如果使用构造函数创建对象,则将使用构建器模式。
  • 当您从json读取时,将使用Jackson的ObjectMapper(您不会调用构造函数)

这些都是完全不同的用例,这些用例在使用方面完全不同。所以我认为他们不应该发生冲突。

唯一必须注意的是,如果你已经实现了两者,你应该尽量避免在任何地方使用setter。你应该只坚持建设者。因此,根据我的说法,同时使用两者都应该没有任何问题。

希望这有帮助。
祝你好运

答案 2 :(得分:0)

这是将一个对象从另一个对象复制的做法:

public class Contact {
  private String firstName;
  private String lastName;

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

  public void clone(Contact c) {
    setFirstName(c.getFirstName());
    setLastName(c.getLastName());
  }
}