62,614
社区成员
发帖
与我相关
我的任务
分享
String name = null;
Optional<String> nameOpt = Optional.ofNullable(name);
Optional<String> emptyOpt = Optional.empty();
System.out.println(nameOpt == emptyOpt);
输出结果为true,这下明白了吧,方法的说明已经告诉你了,当你要判断一个对象是否为空是,使用==跟Optional.empty()比较即可,另外代替的方式也可使用isPresent()方法来判断一个对象是否为null。
如果你要想,为什么这两个对象可以用==来比较,不是应该使用equals吗?这时你可以再看一下Optional.ofNullable()这个方法的文档,如下:
Returns an Optional describing the specified value, if non-null, otherwise returns an empty Optional.
如果值是非空的,则返回描述指定值的Optional,否则返回empty的Optional。
这下懂了吧,如果值是null,则返回empty的Optional。 甚至,你可以看一下ofNullable的源码,如下:
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
调用多次empty()方法返回的Optional对象使用==可以返回true,说明了什么呢?说明了empty()每次返回的都是同一个对象,所以可以使用==来比较,不信就看一下源码,如下:
private static final Optional<?> EMPTY = new Optional<>();
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
看到这里,唯一让我不明白的是empty()方法中的一句话There is no guarantee that it is a singleton(无法保证它是一个单例).看这源码明明是单例啊,而且是一个饿汉式的单例,这种单例是线程安全的,怎么就不能保证它是一个单例呢?如果不能保证是单例的话,为什么要叫我们用==来测试对象是否为空呢?除非有道词典的翻译是错误的:
avoid testing if an object is empty by comparing with == against instances returned by Option.empty()
这个可能是这样翻译的:避免使用==那Optional.empty()返回的实现比较来判断一个对象是否为空。
有英文好的过来说一下么?这上面的英文正确的翻译应该是什么?
如果是这样理解的话,那Optional.empty()的作用应该就只有一个了,节省内存,避免创建多个值为null的Optional对象,因为Optional.ofNullable()方法接收的对象如果是null就使用返回empty()方法创建的Optional,而且这个Optional是返回一个静态的实例对象,所以多次调用empty返回的是同一个Optional对象,目前看来empty返回的对象是单例的,文档说不保证是单便,那就是说他以后也可以把final修符去掉,那就不是单例了嘛!