如何通过AutoValue.Builder清除AutoValue的Optional属性?
问题
我有一个带有Optional属性的AutoValue类,并且配有Builder。能不能用Builder清除这个Optional属性?我在AutoValue.Builder的文档里没找到相关内容。如果没法实现,有没有推荐的解决办法?
示例代码
package com.google.sandbox; import com.google.auto.value.AutoValue; import java.util.Optional; @AutoValue public abstract static class MainMessage { public static Builder builder() { return new AutoValue_MainClass_MainMessage.Builder(); } public abstract Optional<Integer> val(); public abstract Builder toBuilder(); /** Builder for MainMessage. */ @AutoValue.Builder public abstract static class Builder { public abstract Builder setVal(int value); public abstract Builder clearVal(); // 这会导致编译错误。 public abstract MainMessage build(); } }
编译错误信息
[AutoValueBuilderNoArg] Method without arguments should be a build method returning com.google.sandbox.MainClass.MainMessage, or a getter method with the same name and type as a property method of com.google.sandbox.MainClass.MainMessage, or fooBuilder() where foo() or getFoo() is a property method of com.google.sandbox.MainClass.MainMessage public abstract Builder clearVal();
解答
AutoValue的Builder默认不支持clearVal()这类无参清除方法——它的规则明确限定:无参方法只能是build方法、属性getter或者嵌套Builder的创建方法,这就是你触发编译错误的原因。
要实现清除Optional属性的需求,推荐两种方案:
方案1:新增接受Optional<Integer>的setter方法
在Builder里添加一个接受Optional<Integer>参数的重载setVal方法,通过传入Optional.empty()来实现清除逻辑:
@AutoValue.Builder public abstract static class Builder { // 保留原有接受int的setter public abstract Builder setVal(int value); // 新增接受Optional的setter,实现清除逻辑 public Builder setVal(Optional<Integer> optionalVal) { return optionalVal.isPresent() ? setVal(optionalVal.get()) : clearValInternal(); } // AutoValue会自动生成这个私有抽象方法,用于重置val为空Optional private abstract Builder clearValInternal(); public abstract MainMessage build(); }
调用时只需传入Optional.empty(),就能把val重置为初始的空Optional状态。
方案2:通过toBuilder()配合显式设置
如果是基于已有的MainMessage实例创建Builder,直接调用上述重载的setter方法传入Optional.empty()即可覆盖原有值:
MainMessage original = MainMessage.builder().setVal(123).build(); MainMessage clearedMessage = original.toBuilder().setVal(Optional.empty()).build();
注意:AutoValue中声明的Optional属性默认初始值是空Optional(而非null),所以"清除"操作本质就是将属性重置回这个初始状态。
内容的提问来源于stack exchange,提问作者Chris Morris
相关产品推荐
相关产品推荐

