魔功心法-列舉篇

2023-04-04 18:00:31

前言:
https://www.cnblogs.com/LoveBB/p/17277662.html

什麼是列舉

枚:量詞。一般用於較小的片狀物,相當於「個」。

舉:提出:列舉。舉一反三。舉個例子。

所以,列舉就是一個個列舉出來

列舉的作用

魔功的作用,就不過多描述了,主打的就是一個優雅。

列舉的使用

列舉的成員方法

在學習列舉之前,我們很有必要了解他的幾個比較重要的成員方法。我們先定義一個列舉如下:

public enum TestEnum {
}
  • 這裡可以看到,列舉中有兩個比較重要的方法,分別是 values() 和 valueOf();
方法名稱 具體含義 使用方法
values() 該方法可以將列舉型別成員以陣列的形式返回 列舉型別名稱.values()
valueOf() 該方法可以實現將普通字串轉換為列舉範例 列舉型別名稱.valueOf("ABC")
  • 下面我們隨便在列舉中新增兩個屬性 boy 和 girl
// 規範寫法
public enum TestEnum {
    BOY,GIRL
}

// 屬性大寫只是一種規範,小寫也是可以的
public enum TestEnum {
    Boy,Girl
}

// 既然小寫可以,那麼亂寫也是沒有問題的
public enum TestEnum {
    BoY,giRL
}
  • 我們使用規範的方法,試試列舉中的 values() 方法,這個方法是拿到 TestEnum 中的所有屬性,並且以陣列的形式返回。


  • 試試列舉中的 values() 方法

從上面可以看到,這三者的返回值是一樣的,型別都是 TestEnum。那這個方法就沒啥好看的了,就是拿到 TestEnum 中的單個屬性。

列舉與常數類的對比

列舉類

public enum TestEnum {
    BOY,GIRL
}

常數類

public class TestConstant {
    private static Integer BOY;
    private static Integer GIRL;
}
  • 列舉和常數類的對比一目瞭然。但是一般情況下,我們使用常數類都是下面這種形式。
public class TestConstant {
  	// 男
    private static final Integer BOY = 0;
    // 女
    private static Integer GIRL = 1;
}
  • 這樣看起來是不是更加親切了,那麼列舉類應該怎麼寫呢,效果如下
@Getter
public enum TestEnum {
    BOY(0),GIRL(1);
    private Integer code;
    TestEnum(Integer code){
        this.code = code;
    }

}
  • 兩者使用對比
public static void main(String[] args) {
    // 使用常數類
    Integer boy = TestConstant.BOY;
    Integer girl = TestConstant.GIRL;

    // 使用列舉
    Integer enumBoy = TestEnum.BOY.getCode();
    Integer girlCode = TestEnum.GIRL.getCode();
}

列舉與常數類的使用

  • 眾所周知,我們對前端展示的 性別 這個屬性,一般在資料表中都是存 0,1。這樣的話,每次查詢和入庫都需要做轉換。
@Data
public class People {
   private String gender;
}
  • 常數類轉化
People people = new People();
// int 轉為 String
Integer boy = TestConstant.BOY;
if (boy == 0) {
    people.setGender("男");
}
Integer girl = TestConstant.GIRL;
if (girl == 1) {
    people.setGender("女");
}
  • 列舉轉化
People people = new People();
// 使用列舉
Integer enumBoy = TestEnum.BOY.getCode();
if (enumBoy == 0) {
    people.setGender("男");
}
Integer girlCode = TestEnum.GIRL.getCode();
if (girlCode == 1) {
    people.setGender("女");
}

毫無違和感,那還要列舉幹啥勒。彆著急,下面就介紹列舉的另一種用法 :

@Getter
public enum TestEnum {
    BOY(0,"男"),GIRL(1,"女");
    private Integer code;
    private String name;
    TestEnum(Integer code,String name){
        this.code = code;
    }
}
  • 列舉轉化 2
People people = new People();
// 使用列舉
Integer enumBoy = TestEnum.BOY.getCode();
if (enumBoy == 0) {
    String name = TestEnum.BOY.getName();
    people.setGender(name);
}

Integer girlCode = TestEnum.GIRL.getCode();
if (girlCode == 1) {
    String name = TestEnum.GIRL.getName();
    people.setGender(name);
}

真好,如果工資是按程式碼行數發的,那你就能多拿兩打工資了

  • 列舉轉化3

上面 2 的寫法,基本上都是固定了,不符合物件導向的寫法,我們應該抽象出來這一個方法,方法的入參是 int 型別,返回值是 String 型別。比如傳入一個 0,返回一個男,傳入一個 1,返回一個女。這個時候前面的這個 values() 方法就派上用場了

@Getter
public enum TestEnum {
    BOY(0,"男"),GIRL(1,"女");
    private Integer code;
    private String name;
    TestEnum(Integer code,String name){
        this.code = code;
    }

    // 這個是抽象的方法,放在列舉裡面 
    public static String getName(int code) {
        // 遍歷 TestEnum.values()
        for (TestEnum testEnum : TestEnum.values()) {
            // 如果列舉 code 和傳入的 code相同,返回對應的文字
            if (testEnum.getCode() == code) {
                return testEnum.name;
            }
        }
        // 不匹配,返回預設值
        return null;
    } 

}
  • 使用方法改造
People people = new People();
// 使用列舉
Integer enumBoy = TestEnum.BOY.getCode();
if (enumBoy == 0) {
    people.setGender(TestEnum.getName(0));
}

Integer girlCode = TestEnum.GIRL.getCode();
if (girlCode == 1) {
    people.setGender(TestEnum.getName(1));
}

是不是有高手那味了,這就是魔功列舉的強大之處,隨隨便便一個常數,就硬生生給你整成高手範。


列舉的進階

  • 完了嘛?如果只是簡單的使用,確實是完了,但是我們的追求遠不止如此,我們用了列舉,就一定要用出高手風範:一切皆可列舉

三屬性列舉

要獲取每個網站的地址,要把每個網站的地址儲存起來,網站地址都是已知的。並且不做維護。

  • 如果要建立一張表,大概如下:

  • 如果我們用列舉來實現,就是下面這樣
@Getter
public enum InternetEnum {
    BAIDU(1,"百度","www.baidu.com"),
    HUOHU(2,"火狐","www.huohu.com"),
    GUGLE(3,"谷歌","www.guge.com"),
    SLO(4,"360","www.360.com"),
    QQ(5,"qq","www.qq.com");
    private Integer code;
    private String name;
    private String address;
    private InternetEnum(int code,String name,String address) {
    this.code = code;
    this.name = name;
    this.address = address;
    }

    private String getName(int code){
        for (InternetEnum internetEnum : InternetEnum.values()) {
            if (internetEnum.getCode()==code){
                return internetEnum.getName();
            }
        }
        return null;
    }

    private String getAddress(int code){
        for (InternetEnum internetEnum : InternetEnum.values()) {
            if (internetEnum.getCode()==code){
                return internetEnum.getAddress();
            }
        }
        return null;
    }
}

這裡只是舉個例子,前提是這些屬性不經常變的,如果是經常變的,還是得考慮使用資料表。至於哪些是不變的,如果你維護過別人的程式碼,就一定能見過很多這樣的東西,這時候大膽使用列舉改掉他。

N屬性

  • 有了三屬性,就有四屬性,五屬性,不知道,當你看到下面這種列舉的時候,你會不會陷入沉思,並且優雅親切來上一句問候

列舉神奇之處

  • 列舉用順手之後,萬物皆可列舉
  • 對前端:傳 0,1 入參就行
  • 對資料表,咱就存 0,1 就行
  • 這樣一來,主動權就在你手裡了,當別人看著資料表一堆 0,1 陷入沉思的時候、當前端其他人來接手你的程式碼時,前端傳給他一堆 0,1的時候,就是魔功顯示威力的時候。