Android低API版本(低于24)下Java Optional的最佳替代方案是什么?
低API级别下替代Optional的最佳实践
别直接依赖null——虽然能用,但很容易触发空指针异常,属于风险较高的方案,优先考虑下面这些替代手段:
1. 自定义轻量Optional类
自己实现一个极简版的Optional,只保留核心功能,完全不受系统API级别限制,用法和Java官方的Optional一致。示例代码:
public class Optional<T> { private static final Optional<?> EMPTY = new Optional<>(null); private final T value; private Optional(T value) { this.value = value; } public static <T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; } public static <T> Optional<T> of(T value) { if (value == null) { throw new NullPointerException("value cannot be null"); } return new Optional<>(value); } public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); } public boolean isPresent() { return value != null; } public T get() { if (value == null) { throw new NoSuchElementException("No value present"); } return value; } public T orElse(T other) { return value != null ? value : other; } }
按需添加需要的方法即可,比如orElseGet、ifPresent这些,不用一次性实现所有功能。
2. 用Guava的Optional
如果项目已经引入Guava库,直接用com.google.common.base.Optional——这个类很早就提供了,兼容低API级别,核心方法和Java官方Optional对齐,不用自己造轮子。
3. 调整逻辑避免返回null
如果是你自己维护的代码,尽量从源头避免返回null:
- 返回集合时,用
Collections.emptyList()/Collections.emptyMap()替代null,调用方直接遍历即可,无需判空 - 自定义业务对象可以定义一个静态空实例,比如
public static final User EMPTY_USER = new User();,调用方用这个实例做默认处理,不用判断null
内容的提问来源于stack exchange,提问作者Daniel Choi
相关产品推荐
相关产品推荐

