如何在通用 class 中使用 AutoValue 跳过 testBuilder 的生成
How to skip generation of testBuilder with AutoValue in generic class
自动值版本:1.3
给出以下 class:
@AutoValue
public abstract class SimpleClass<T> {
public static <E> SimpleClass<E> create(Set<? extends E> someField) {
return SimpleClass.<E>builder().someField(someField).build();
}
public static <E> Builder<E> builder() {
return new AutoValue_SimpleClass.Builder<E>();
}
public abstract ImmutableSet<T> someField();
@AutoValue.Builder
public abstract static class Builder<T> {
public abstract Builder<T> someField(Set<? extends T> someField);
public abstract SimpleClass<T> build();
}
}
当自动生成器生成上述 class 的源代码时,它会生成如下内容:
final class AutoValue_SimpleClass<T> extends $AutoValue_SimpleClass<T> {
AutoValue_SimpleClass(ImmutableSet<T> someField) {
super(someField);
}
static SimpleClass.Builder<E> testBuilder() {
return builder();
}
}
请注意泛型方法 testBuilder
是如何错误生成的,因为它在 static
之后需要 <E>
。
这是应该生成的:
static <E> SimpleClass.Builder<E> testBuilder() {
return builder();
}
是否有办法不生成此 testBuilder
方法或确保 AutoValue
生成正确来源的方法?
谢谢。
编辑: 刚刚更新到 1.4,同样的事情还在发生
令人惊讶的是,解决方案并没有太复杂:
只需重命名静态 builder
方法
@AutoValue
public abstract class SimpleClass<T> {
public static <E> SimpleClass<E> create(Set<? extends E> someField) {
return SimpleClass.<E>getBuilder().someField(someField).build();
}
public static <E> Builder<E> getBuilder() {
return new AutoValue_SimpleClass.Builder<E>();
}
public abstract ImmutableSet<T> someField();
@AutoValue.Builder
public abstract static class Builder<T> {
public abstract Builder<T> someField(Set<? extends T> someField);
public abstract SimpleClass<T> build();
}
}
这意味着不再生成testBuilder
方法。
自动值版本:1.3
给出以下 class:
@AutoValue
public abstract class SimpleClass<T> {
public static <E> SimpleClass<E> create(Set<? extends E> someField) {
return SimpleClass.<E>builder().someField(someField).build();
}
public static <E> Builder<E> builder() {
return new AutoValue_SimpleClass.Builder<E>();
}
public abstract ImmutableSet<T> someField();
@AutoValue.Builder
public abstract static class Builder<T> {
public abstract Builder<T> someField(Set<? extends T> someField);
public abstract SimpleClass<T> build();
}
}
当自动生成器生成上述 class 的源代码时,它会生成如下内容:
final class AutoValue_SimpleClass<T> extends $AutoValue_SimpleClass<T> {
AutoValue_SimpleClass(ImmutableSet<T> someField) {
super(someField);
}
static SimpleClass.Builder<E> testBuilder() {
return builder();
}
}
请注意泛型方法 testBuilder
是如何错误生成的,因为它在 static
之后需要 <E>
。
这是应该生成的:
static <E> SimpleClass.Builder<E> testBuilder() {
return builder();
}
是否有办法不生成此 testBuilder
方法或确保 AutoValue
生成正确来源的方法?
谢谢。
编辑: 刚刚更新到 1.4,同样的事情还在发生
令人惊讶的是,解决方案并没有太复杂:
只需重命名静态 builder
方法
@AutoValue
public abstract class SimpleClass<T> {
public static <E> SimpleClass<E> create(Set<? extends E> someField) {
return SimpleClass.<E>getBuilder().someField(someField).build();
}
public static <E> Builder<E> getBuilder() {
return new AutoValue_SimpleClass.Builder<E>();
}
public abstract ImmutableSet<T> someField();
@AutoValue.Builder
public abstract static class Builder<T> {
public abstract Builder<T> someField(Set<? extends T> someField);
public abstract SimpleClass<T> build();
}
}
这意味着不再生成testBuilder
方法。