如何 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
。提前致谢。
答案是在SomeObject
中声明一个toBuilder
方法
public abstract Builder toBuilder();
生成的子class将实现这个方法。
我最近在和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
。提前致谢。
答案是在SomeObject
toBuilder
方法
public abstract Builder toBuilder();
生成的子class将实现这个方法。