AutoValue和Optional小记
读Modern Java in Action, 2nd Edition, 划水一篇小记
AutoValue User Guide: https://github.com/google/auto/blob/master/value/userguide/builders-howto.md
java.util.Optional: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
Nullable and Optional
使用AutoValue的时候, 有些fields需要是Nullable的, 有两种处理方式:
- 使用Nullable,
- 使用Optional.
Nullable
@AutoValue
public abstract class Foo {
public static Foo create(@Nullable Bar bar) {
return new AutoValue_Foo(bar);
}
@Nullable abstract Bar bar();
}
Optional
@AutoValue
public abstract class Animal {
public abstract Optional<String> name();
public static Builder builder() {
return new AutoValue_Animal.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
// You can have either or both of these two methods:
public abstract Builder setName(Optional<String> value);
public abstract Builder setName(String value);
public abstract Animal build();
}
}
使用Nullable的缺点: foo.bar().xxx().yyy()
, 这种调用链会抛出NullPointerException.
而使用Optional的缺点: java.util.Optional
并不是Serializable的, 这会导致AutoValue也不可以Serializable.
这种情况下, 可以使用com.google.common.base.Optional
, 不过Guava的Optional的接口和Java的并不完全一致…
比如java.util.Optional有flatMap,而com.google.common.base.Optional只有transform…
为什么Optional不支持Serializable
这几天看书才明白这个问题, java的Optional在设计的时候, 认为Optional应该只用在接口设计上, 而不是将fields声明称Optional类型. 所以说,java官方对Nullable fields的设计想法是这样的:
public class Foo {
@Nullable private Bar bar;
public Optional<Bar> bar();
}
从这个角度来讲,AutoValue有必要更新一下自己的接口…
文档信息
- 本文作者:SryImNoob
- 本文链接:https://sryimnoob.com/2020/10/13/AutoValue-and-Optional/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)