Optional源码解析与实践

1 导读NullPointerException在开发过程中经常遇到,稍有不慎小BUG就出现了,如果避免这个问题呢 , Optional就是专门解决这个问题的类,那么Optional如何使用呢?让我们一起探索一下吧!
2 源码解析2.1 Optional定义Optional类是Java8为了解决null值判断问题而创建的容器类,在java.util 下,使用Optional类可以避免显式的null值判断 , 避免null导致的NullPointerException 。首先,Optional是一个容器,它可以保存类型T的值 , 也可以为null的容器对象 。Optional容器只能存一个值 。
2.2 Optional的属性1)源码:

  1. /**
  2. * Common instance for {@code empty()}.
  3. */
  4. private static final Optional<?> EMPTY = new Optional<>();
  5. /**
  6. * If non-null, the value; if null, indicates no value is present
  7. */
  8. private final T value;
根据源码可以看到Optional有两个属性,一个是为空值准备的EMPTY和泛型值value;
2.3 Optional的方法Optional除toString()、hashCode() 、equals()等Object的方法外,还包含以下方法 。
2.3.1 私有构造方法
  1. /**
  2. * Constructs an empty instance.
  3. *
  4. * @implNote Generally only one empty instance, {@link Optional#EMPTY},
  5. * should exist per VM.
  6. */
  7. private Optional() {
  8. this.value = https://www.huyubaike.com/biancheng/null;
  9. }
  10. /**
  11. * Constructs an instance with the value present.
  12. *
  13. * @param value the non-null value to be present
  14. * @throws NullPointerException if value is null
  15. */
  16. private Optional(T value) {
  17. this.value = https://www.huyubaike.com/biancheng/Objects.requireNonNull(value);
  18. }
【Optional源码解析与实践】分别是创建一个空实例和构造一个具有当前值的实例 。
2.3.2 创建方法1)源码
  1. public static<T> Optional<T> empty() {
  2. @SuppressWarnings("unchecked")
  3. Optional<T> t = (Optional<T>) EMPTY;
  4. return t;
  5. }
  6. public static <T> Optional<T> of(T value) {
  7. return new Optional<>(value);
  8. }
  9. public static <T> Optional<T> ofNullable(T value) {
  10. return value =https://www.huyubaike.com/biancheng/= null ? empty() : of(value);
  11. }
2)方法说明
  • empty(): 创建一个空的 Optional 实例
  • of(T t) : 创建一个 Optional 实例,当 t为null时抛出异常
  • ofNullable(T t): 创建一个 Optional 实例,但当 t为null时不会抛出异常,而是返回一个空的实例
3)测试代码
  1. public static void main(String[] args) {
  2. Integer value1 = null;
  3. Integer value2 = 1;
  4. try {
  5. Optional<Integer> optional1 = Optional.empty();
  6. System.out.println("optional1创建了");
  7. }catch (Exception e){
  8. System.out.println("optional1失败了");
  9. }
  10. try {
  11. Optional<Integer> optional2 = Optional.of(value1);
  12. System.out.println("optional2创建了");
  13. }catch (Exception e){
  14. System.out.println("optional2失败了");
  15. }
  16. try {
  17. Optional<Integer> optional3 = Optional.ofNullable(value1);
  18. System.out.println("optional3创建了");
  19. }catch (Exception e){
  20. System.out.println("optional3失败了");
  21. }
  22. try {
  23. Optional<Integer> optional4 = Optional.of(value2);
  24. System.out.println("optional4创建了");
  25. }catch (Exception e){
  26. System.out.println("optional4失败了");
  27. }
  28. try {
  29. Optional<Integer> optional5 = Optional.ofNullable(value2);
  30. System.out.println("optional5创建了");
  31. }catch (Exception e){
  32. System.out.println("optional5失败了");
  33. }
  34. }
4)运行结果

推荐阅读