運用Optional來處理nullable的列舉型別(Enum)

作者:戴玉佩
精誠資訊 恆逸教育訓練中心 資深講師
技術分類:程式設計

在處理列舉型別的資料時,若這個資料存入資料庫時允許null(也就是所謂的非必要欄位)時,從資料庫讀出資料時常會因為少了null檢查而發生NullPointerException。

這樣的資料多半也允許使用者在輸入項中輸入空字串,而空字串在做列舉型別的資料轉換時又會造成IllegalArgumentException!這些都剛好是RuntimeException,所以開發人員往往忽略了這類錯誤處理而造成執行時期錯誤!

以下的程式碼模擬了這樣的情形:

1.	public class TestNullableBloodType {
2.	 public static void main(String[] args) {
3.	  //模擬狀況1: 自資料庫讀出血型為"AB"的資料
4.	  String bType1 = "AB";
5.	  System.out.println(BloodType.valueOf(bType1));//成功轉換並輸出正確血型
6.	
7.	  //模擬狀況2: 自資料庫讀出一筆血型為null的資料
8.	  try {
9.	   String bType2 = null;
10.	   System.out.println(BloodType.valueOf(bType2)); //NullPointerException
11.	  } catch (NullPointerException ex) {
12.	   System.out.println("第10行發生:"+ex);
13.	  }
14.	
15.	  //模擬狀況3: 前端使用者輸入血型為""的資料(表示未輸入血型資料)
16.	  try {
17.	   String bType3 = "";
18.	   System.out.print(BloodType.valueOf(bType3)); //IllegalArgumentException
19.	  } catch (IllegalArgumentException ex) {
20.	   System.out.println("第18行發生:"+ex);
21.	  }
22.	 }
23.	}
24.	
25.	enum BloodType {
26.	 O, A, B, AB;
27.	}

現在只要運用JDK 8的Optional類別就能提供簡潔又安全的程式來避免這樣的錯誤。以下為加上了Optional類別的程式示範:

1.	public class TestNullableBloodType {
2.	 public static void main(String[] args) {
3.	  //模擬狀況1: 自資料庫讀出血型為"AB"的資料
4.	  String bType1 = "AB";
5.	  BloodType bloodType1 = BloodType.valueOf(Optional.ofNullable(bType1));
6.	  System.out.println(bloodType1);//成功轉換並輸出正確血型
7.	
8.	  //模擬狀況2: 自資料庫讀出一筆血型為null的資料
9.	  String bType2 = null;
10.	  BloodType bloodType2 = BloodType.valueOf(Optional.ofNullable(bType2));
11.	  System.out.println(bloodType2); //成功轉換並輸出null
12.	
13.	  //模擬狀況3: 前端使用者輸入血型為""的資料(表示未輸入血型資料)
14.	  String bType3 = "";
15.	  BloodType bloodType3 = BloodType.valueOf(Optional.ofNullable(bType3));
16.	  System.out.println(bloodType3); //成功轉換並輸出null
17.	 }
18.	}
19.	
20.	enum BloodType {
21.	 O, A, B, AB;
22.	
23.	 public static BloodType valueOf(Optional optName){
24.	   if(optName.isPresent() && !optName.get().isEmpty()){
25.	     return BloodType.valueOf(optName.get());
26.	  }else{
27.	     return null;
28.	  }
29.	 }
30.	}
Share |

您可在下列課程中了解更多技巧喔!

相關學習資源

【SL-110-SE8】Java SE8初階程式設計
【SL-275-SE8】Java SE8程式語言設計