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)運行結果

推薦閱讀