雖然程式碼簡化了,對於 case 少的用例來說,還不至於會影響效能,但如果要比對的字串有十幾個呢?一堆 swith case 寫起來也不見得輕鬆,而且最重要的是那要怎麼設計,才能又有效率且又能兼顧程式碼的易維護性與高擴充性呢?
對於這類固定且需要大量重復使用的字串,我們可以把它們集合起來,宣告了一 Enum 型別來包裝他們。例如我們宣告個 Fruit 的 Enum:
package idv.jacky.ironman4.day8;
public enum Fruit {
蘋果,
草莓,
香蕉,
芭樂,
葡萄;
}
程式碼非常的簡單,就直接把要的字串,一個個打上去,並用逗號(,)隔開,最後用分號(;)結束宣告。
Java 編譯器會自動將這些字串,依序編號為 0, 1, 2, 3, 4的整數值(int),既然是整數,我們就可以直接使用原本的 switch 陳述式了。
package idv.jacky.ironman4.day8;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Day8Example {
public static void main(String[] args) {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Fruit fruit = null;
String color;
while (true) {
System.out.print("請輸入一種水果(蘋果, 草莓, 香蕉, 芭樂, 葡萄) > ");
try {
fruit = Fruit.valueOf(in.readLine());
} catch (Exception e) {
continue;
}
switch (fruit) {
case 蘋果:
case 草莓:
color = "紅色";
break;
case 香蕉:
color = "黃色";
break;
case 芭樂:
color = "綠色";
break;
case 葡萄:
color = "紫色";
break;
default:
continue;
}
if (fruit != null && color != null)
System.out.printf("%s 的顏色是 %s%n", fruit, color);
fruit = null;
color = null;
}
}
}
新的程式碼是不是跟上一個範例一樣簡潔!而且因為使用整數來比對判斷,效率上也會來的比較好,程式碼也易於撰寫,不會出錯。因為所有的值我們都定義在 Fruit 這個 Enum型別裡,在使用上不會不小心把 "芭樂" 打成 "巴樂"。而且也容易擴充和維護,需要新的值,就只要在 Fruit 裡添加就行了。
更進一步有關 Enum 的詳細使用說明,請參考 Java 程式相關書籍。