今天要講的東西跟我平常在講的Android開發稍微沒那麼有直接的關係

今天想講的內容是在撰寫Java之中會被使用到的一個寫法-枚舉(Enum)

枚舉是什麼呢?簡單來說就是「把所有可能會出現的事情」都列舉出來的方式

打個比方,假設今天要做一個這樣的介面

截圖 2023-02-25 下午10.00.24

你會選擇如何完成呢?

A. 拉四個Button然後調整使之對齊

B. 建立RecyclerView增加4個Item

 

 

其實哪個方式都可以,都是依據專案狀況而定

以我個人經驗來說,通常B選項會出現的次數比較多,畢竟客戶這種生物就是很喜歡「越想越不對勁」

而如果使用B方法的話,那我可以肯定這裡使用枚舉Enum絕對是一種好方式

 

這篇介紹我是用intellij寫的,基本上操作介面都是一樣的,應該可以很快就帶入到Android Studio裏面

那麼,就來個Github吧!

-> 點我

 


 

1. 一般的枚舉

在講枚舉前,我們要知道如何設置枚舉

首先在想要設置枚舉的資料夾上點右鍵->New->Java Class

截圖 2023-02-25 下午10.24.13

然後在這裡點選「Enum」

截圖 2023-02-25 下午10.26.26

就成功創立好囉!

那如果建立錯了也沒關係,在創建好Java檔案之後,直接刪掉打上enum就可以囉

截圖 2023-02-25 下午10.28.27

 

Okay,那如何寫個簡單的枚舉?如下

NormalEnum.java

public enum NormalEnum {
    HELLO1,
    HELLO2,
    HELLO3

}

 

恩?就這樣?

image

是的,就這樣,一個簡單的枚舉

那無核使用呢?其實也很簡單

System.out.println(NormalEnum.HELLO1);

 

這樣的話,輸出結果就會是

截圖 2023-02-25 下午10.38.57

很簡單吧!

再來,java也提供了很簡單的方法讓你取得你所有的枚舉,只要像這樣

System.out.println("再來,使用values()可以調用該枚舉的所有內容:");
for (NormalEnum normal : NormalEnum.values()
) {
    System.out.println(normal);
}
System.out.println();

打上.values(),就可以取得枚舉陣列

截圖 2023-02-25 下午10.41.32

 

再者,枚舉可以拿來當作條件判斷式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. 帶有參數的枚舉

再來,來一個帶參數枚舉的示範,如下

WithTagEnum.java

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();

截圖 2023-02-25 下午11.50.23

沒錯,只要調用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();

截圖 2023-02-25 下午11.49.47

最後,雖然大多數我們用枚舉感覺都是拿來取固定資料的,但其實枚舉也可以拿來存參數

System.out.println("最後,想要往裡面丟值也當然是做得到的");
WithTagEnum3.KIN.setInfo("안녕하세요","Korea",8);
System.out.println("來自"+WithTagEnum3.KIN.getCountry()+""+WithTagEnum3.KIN
        +"説:"+WithTagEnum3.KIN.getSays());

截圖 2023-02-25 下午11.49.27

雖然我不太確定有沒有人會這樣弄,但我自己如果要這樣做的話會很小心使用

畢竟這存下去是靜態類的,沒弄好的話也許會產生意想不到的畫面失誤

就,看個人如何使用囉

 


 

其實enum我很早以前就知道,但其實可能是因為當時的專案沒用的,所以就一直拖著沒講

不過最近的專案中大量使用到了enum,使我感覺這東西還是拿出來講講,做做筆記好了...的這樣的心情,寫下了這一篇

只能說在寫程式的世界裡,很多在學校學到的東西真的會在你無意間在工作上派上用場XD

總之也希望這篇能對你有點幫助囉!

TK

arrow
arrow
    創作者介紹
    創作者 碼農日常 的頭像
    碼農日常

    碼農日常大小事

    碼農日常 發表在 痞客邦 留言(2) 人氣()