如何使用构建器复制/转换AutoValue对象

时间:2017-03-14 08:38:27

标签: java builder auto-value

我最近和建筑师一起玩自动值。在这种情况下,我说我必须将现有对象转换为具有一些属性的新对象得到更新。示例代码在这里:

@AutoValue
public abstract class SomeObject {
    public static Builder builder() {
      ...
    }

    public abstract String prop1();
    public abstract int prop2();

    // Populate a builder using the current instance.        
    public Builder newBuilder() {
        ...
    }
}

注意我写了一个newBuilder方法,以便我可以像这样进行转换:

SomeObject resultedObject = originObject.newBuilder()
    .setProp2(99)
    .build();

是的,我可以这样写newBuilder

public Builder newBuilder() {
    return new AutoValue_SomeObject.Builder()
            .setProp1(this.prop1())
            .setProp2(this.prop2());
}

但应该有更好的方法,特别是在现实生活中处理复杂物体时。这样的事情会更好:

public Builder newBuilder() {
    return new AutoValue_SomeObject.Builder(this);
}

不幸的是,生成的构造函数Builder(SomeObject)是私有的,我找不到任何引用。

那么你对这个问题的看法是什么?

AutoValue版本为1.4-rc2。提前致谢。

1 个答案:

答案 0 :(得分:7)

请参阅JakeWharton's reply

答案是在toBuilder

中声明SomeObject方法
public abstract Builder toBuilder();

生成的子类将实现此方法。