今天要講的東西跟我平常在講的Android開發稍微沒那麼有直接的關係
今天想講的內容是在撰寫Java之中會被使用到的一個寫法-枚舉(Enum)
枚舉是什麼呢?簡單來說就是「把所有可能會出現的事情」都列舉出來的方式
打個比方,假設今天要做一個這樣的介面
你會選擇如何完成呢?
A. 拉四個Button然後調整使之對齊
B. 建立RecyclerView增加4個Item
其實哪個方式都可以,都是依據專案狀況而定
以我個人經驗來說,通常B選項會出現的次數比較多,畢竟客戶這種生物就是很喜歡「越想越不對勁」
而如果使用B方法的話,那我可以肯定這裡使用枚舉Enum絕對是一種好方式
這篇介紹我是用intellij寫的,基本上操作介面都是一樣的,應該可以很快就帶入到Android Studio裏面
那麼,就來個Github吧!
-> 點我
1. 一般的枚舉
在講枚舉前,我們要知道如何設置枚舉
首先在想要設置枚舉的資料夾上點右鍵->New->Java Class
然後在這裡點選「Enum」
就成功創立好囉!
那如果建立錯了也沒關係,在創建好Java檔案之後,直接刪掉打上enum就可以囉
Okay,那如何寫個簡單的枚舉?如下
public enum NormalEnum { HELLO1, HELLO2, HELLO3 }
恩?就這樣?
是的,就這樣,一個簡單的枚舉
那無核使用呢?其實也很簡單
System.out.println(NormalEnum.HELLO1);
這樣的話,輸出結果就會是
很簡單吧!
再來,java也提供了很簡單的方法讓你取得你所有的枚舉,只要像這樣
System.out.println("再來,使用values()可以調用該枚舉的所有內容:"); for (NormalEnum normal : NormalEnum.values() ) { System.out.println(normal); } System.out.println();
打上.values(),就可以取得枚舉陣列
再者,枚舉可以拿來當作條件判斷式if-else或者switch-case的參數使用,如下
System.out.println("枚舉本身可以是可以被當作判斷ifElse或者switch的依據的:"); for (NormalEnum normal : NormalEnum.values() ) { if (normal.equals(NormalEnum.HELLO3)) System.out.println("取得Hello3"); switch (normal) { case HELLO1: System.out.println("取得Hello1"); break; default: break; } } System.out.println();
如此一來,套用在RecyclerView底下的OnItenClickListener的話就可以輕鬆判斷出選項囉
2. 帶有參數的枚舉
再來,來一個帶參數枚舉的示範,如下
public enum WithTagEnum { Noah("Hi","USA",1), Santos("Hola","Colombia",2), Frieda("Hallo","Germany",3), Alexis("Привет","Russia",4); private String says; private String country; private int number; WithTagEnum(String says, String country, int number) { this.says = says; this.country = country; this.number = number; } public String getSays() { return says; } public String getCountry() { return country; } public int getNumber() { return number; } }
這邊要注意的是,如果是帶參數的枚舉的話一定要加入建構子
WithTagEnum(String says, String country, int number) { this.says = says; this.country = country; this.number = number; }
他才不會報錯。而建構子的數量也要跟你上面的參數數量吻合,基本上只要有吻合到你參數愛放幾個就放幾個XD
但如果你的參數是要被「外面」能取得到的話,就必須得加上Getter才能被外面取得到
麻....反正不知道怎麼寫的話拿我的範例去督一督就知道了
那麼,外部如何使用呢?
如下
System.out.println("如果你的枚舉有getter的話,還可以取得數值:"); System.out.println("來自"+WithTagEnum.Alexis.getCountry()+"的"+WithTagEnum.Alexis +"説:"+WithTagEnum.Alexis.getSays()); System.out.println();
沒錯,只要調用WithTagEnum.Alexis.getCountry()就可以了,相當方便
3. 枚舉的綜合應用
最後,根據使用方法不同,枚舉也可以再加上一些像是過濾啊或者從外部設定參數的功能
比方說,像我這個例子就是先寫好讓陣列去根據國家別來調資料
public enum WithTagEnum2 { Noah("Hi","USA",1), Santos("HolLa","Colombia",2), Frieda("Hallo","Germany",3), Sophia("Hallo","Germany",4), LIU("你好","Taiwan",5), TANAKA("こんにちは","Japan",6), Alexis("Привет","Russia",7); private String says; private String country; private int number; WithTagEnum2(String says, String country, int number) { this.says = says; this.country = country; this.number = number; } public String getSays() { return says; } public String getCountry() { return country; } public int getNumber() { return number; } public static Stream<WithTagEnum2> getItemByCountry(String country){ return Arrays.stream(values()).filter(v1->v1.country.equals(country)); } }
從外部使用的話就像這樣
System.out.println("當然,如果你有在枚舉裡面寫過濾的方式的話"); String country = "Germany"; Stream<WithTagEnum2> d = WithTagEnum2.getItemByCountry(country); d.forEach(people->{ System.out.println("來自"+country+"的"+people+"説:"+people.getSays()); }); System.out.println();
最後,雖然大多數我們用枚舉感覺都是拿來取固定資料的,但其實枚舉也可以拿來存參數
System.out.println("最後,想要往裡面丟值也當然是做得到的"); WithTagEnum3.KIN.setInfo("안녕하세요","Korea",8); System.out.println("來自"+WithTagEnum3.KIN.getCountry()+"的"+WithTagEnum3.KIN +"説:"+WithTagEnum3.KIN.getSays());
雖然我不太確定有沒有人會這樣弄,但我自己如果要這樣做的話會很小心使用
畢竟這存下去是靜態類的,沒弄好的話也許會產生意想不到的畫面失誤
就,看個人如何使用囉
其實enum我很早以前就知道,但其實可能是因為當時的專案沒用的,所以就一直拖著沒講
不過最近的專案中大量使用到了enum,使我感覺這東西還是拿出來講講,做做筆記好了...的這樣的心情,寫下了這一篇
只能說在寫程式的世界裡,很多在學校學到的東西真的會在你無意間在工作上派上用場XD
總之也希望這篇能對你有點幫助囉!
留言列表