前言:
https://www.cnblogs.com/LoveBB/p/17277662.html
枚:量詞。一般用於較小的片狀物,相當於「個」。
舉:提出:列舉。舉一反三。舉個例子。
所以,列舉就是一個個列舉出來
魔功的作用,就不過多描述了,主打的就是一個優雅。
在學習列舉之前,我們很有必要了解他的幾個比較重要的成員方法。我們先定義一個列舉如下:
public enum TestEnum {
}
方法名稱 | 具體含義 | 使用方法 |
---|---|---|
values() | 該方法可以將列舉型別成員以陣列的形式返回 | 列舉型別名稱.values() |
valueOf() | 該方法可以實現將普通字串轉換為列舉範例 | 列舉型別名稱.valueOf("ABC") |
// 規範寫法
public enum TestEnum {
BOY,GIRL
}
// 屬性大寫只是一種規範,小寫也是可以的
public enum TestEnum {
Boy,Girl
}
// 既然小寫可以,那麼亂寫也是沒有問題的
public enum TestEnum {
BoY,giRL
}
從上面可以看到,這三者的返回值是一樣的,型別都是 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();
}
@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;
}
}
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);
}
真好,如果工資是按程式碼行數發的,那你就能多拿兩打工資了
上面 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;
}
}
這裡只是舉個例子,前提是這些屬性不經常變的,如果是經常變的,還是得考慮使用資料表。至於哪些是不變的,如果你維護過別人的程式碼,就一定能見過很多這樣的東西,這時候大膽使用列舉改掉他。