如何 copy/transform 带有构建器的 AutoValue 对象

How to copy/transform an AutoValue object with builder

我最近在和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。提前致谢。

请参考JakeWharton's reply

答案是在SomeObject

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

生成的子class将实现这个方法。