8

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

4

1 回答 1

14

请参考JakeWharton 的回复

答案是声明一个toBuilder方法SomeObject

public abstract Builder toBuilder();

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

于 2017-03-18T03:41:02.310 回答