【黑馬程序員】Java枚舉入門

Java枚舉的入門

一、前言

JDK1.5版本之後新增了枚舉,泛型,foreach等特性,另外到了JDK1.6後switch語句支持枚舉類型。從應用角度來講,泛型和foreach我們經常用到,而枚舉用到次數略少,常常被我們忽略,下面是一個枚舉的入門案例。

二、準備工作2.1 設計一個普通性別類

學習枚舉之前我們先來研究一個類:設計一個性別類.該類只能有兩個性別對象(男,女)

//Gender就是一個性別類,性別只能有 男,女。這樣的設計參考單例模式。
public class Gender {
private String sex;
public static final Gender MAN = new Gender("男");
public static final Gender WOMAN = new Gender("女");
private Gender(String sex){
this.sex = sex;
}
@Override
public String toString() {
return "Gender{" +
"sex='" + sex + '\'' +
'}';
}
}

測試代碼:

public class Main {
public static void main(String[] args) {
Gender man = Gender.MAN;

Gender woman = Gender.WOMAN;
System.out.println(man);// 打印結果:Gender{sex='男'}
System.out.println(woman);// 打印結果:Gender{sex='女'}
}
}

總結

以上的設計參考了單利模式,設計了一個Gender類,且該類只能有兩個對象(男,女)。現實生活中,性別也一樣擁有固定個數的值(男,女)。擁有固定的幾個值的這樣的類型我們都可以參考以上的方式去設計該類。以上的代碼是不是感覺略微繁瑣呢?我們可以用另外的簡單的方式去實現嗎?可以,接下來我們用枚舉來實現。

三、枚舉入門3.1 枚舉介紹

(1) 枚舉是一種和類非常相似的結構

(2) 每一個枚舉類型也應該寫在一個java文件之中,編譯完畢也會生成獨立的字節碼文件

(3) 枚舉的語法:

enum 枚舉類型的名字{

① 字段

② 方法

③ 構造方法 // 只能夠是私有的(默認也是私有的)

}

3.2 枚舉案例

(1) 設計一個性別的枚舉.該枚舉只能有兩個性別對象(男,女)

枚舉實現:

public enum GenderEnum {
男,女
}

測試代碼:

public class Test {
public static void main(String[] args) {
GenderEnum man = GenderEnum.男;
GenderEnum woman = GenderEnum.女;
System.out.println(man); //打印結果:男
System.out.println(woman);//打印結果:女
//man 和 woman 就是GenderEnum的兩個對象
System.out.println(man instanceof GenderEnum); //打印結果:true
System.out.println(woman.getClass()); //打印結果:class com.itheima.GenderEnum
}
}

結論:

我們發現man 和 woman 就是枚舉GenderEnum的兩個對象。從以上代碼可以發現我們使用枚舉也完成了同樣的需求,不過代碼中出現了非字符串的中文 ,不規範,我們嘗試把GenderEnum進行改進。

(2) 改進GenderEnum:

public enum GenderEnum {
man,woman
}

測試代碼:

public class Test {
public static void main(String[] args) {
GenderEnum man = GenderEnum.man;
GenderEnum woman = GenderEnum.woman;
System.out.println(man); //打印結果:man
System.out.println(woman);//打印結果:woman
//man 和 woman 就是GenderEnum的兩個對象
System.out.println(man instanceof GenderEnum); //打印結果:true
System.out.println(woman.getClass()); //打印結果:class com.itheima.GenderEnum
}
}

結論:

發現雖然代碼變得規範了,但是這樣沒有打印出中文的"男","女"。沒有很直觀的中文信息顯示。接下來使用枚舉的字段和構造方法來再次改進

(3) 使用枚舉的字段和構造再次改進GenderEnum:

public enum GenderEnum {
//相當於通過有參構造在創建兩個對象
man("男"),woman("女");
//字段

private String name;
//私有有參構造(枚舉中構造只能是私有,默認也是私有)
private GenderEnum(String name){
this.name=name;
}
//覆寫toString的目的是,打印man或者woman對象的時候,打印toString方法的返回結果name.
@Override
public String toString() {
return name;
}
}

測試代碼:

public class Test {
public static void main(String[] args) {
GenderEnum man = GenderEnum.man;
GenderEnum woman = GenderEnum.woman;
System.out.println(man); //打印結果:男
System.out.println(woman);//打印結果:女
//man 和 woman 就是GenderEnum的兩個對象
System.out.println(man instanceof GenderEnum); //打印結果:true
System.out.println(woman.getClass()); //打印結果:class com.itheima.GenderEnum
}
}

結論:

測試代碼不變,打印結果變成了中文的"男"和"女"這樣更加直觀展示,且枚舉中也符合規範。注意:枚舉構造只能是私有的。

(4) 使用枚舉拼接字符串:

public class Test {
public static void main(String[] args) {
GenderEnum man = GenderEnum.man;
GenderEnum woman = GenderEnum.woman;
//枚舉對象拼接字符串
System.out.println(man+"廁所"); //打印結果:男廁所
System.out.println(woman+"廁所");//打印結果:女廁所

}
}

(5) 遍歷枚舉

public class Test {
public static void main(String[] args) {
GenderEnum man = GenderEnum.man;
GenderEnum woman = GenderEnum.woman;
//循環遍歷枚舉中的所有對象
for(GenderEnum genderEnum:GenderEnum.values()){
System.out.println(genderEnum);//第一次循環打印: 男 第二次循環打印:女
}
}
}

結論:

除了拼接字符串,還能使用foreach遍歷枚舉。

(6)思考:為什麼這裡性別能使用枚舉?

因為性別這種類型的值是已知的且有限個數的,男,女。並且是不可能改變的,我們就可以使用枚舉把該類型的所有值列舉出來供別人選擇使用。

什麼情況下我們使用枚舉比較多?

性別

情感狀態

星期

月份

顏色

...

四、總結

枚舉的入門終於寫完了,對於一種有有限個數且已知且不會變化的值的類型,我們可以使用枚舉,以上的枚舉使用方式用的其實是比較多的,下一期會再寫枚舉的進階使用,希望能幫助到更多的朋友,謝謝大家觀看。

【黑馬程序員】Java枚舉入門


分享到:


相關文章: