【java】枚舉類(enum)

一、什麼是枚舉類

1.概念

枚舉的意思就是一個一個的列舉出來。
枚舉類就是起到了把對象一個一個列舉出來的作用,枚舉類是java5中提出的新概念,但是到現在也有很多人不懂這個枚舉類,這些人也包括我,以下是我對枚舉類的學習總結。

2.爲什麼會有枚舉類

枚舉類出現之前

列舉對象一般都是使用static和final來實現的

package model;

public class Person{
    public static final Person a=new Person("a");
    public static final Person b=new Person("b");
    private String name;
    private Person(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

如果每次列舉一個對象都要去創建一個staticfinal對象,這就很麻煩,所以枚舉類就誕生了。

枚舉類出現之後

package model;

/**
 * @author xxj
 * 枚舉類
 */
public enum  EnumPerson {
    A("A"),B("B");
    private String name;
    EnumPerson(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

使用枚舉類就不用再去一個個地敲static final了。

3.什麼地方需要使用枚舉類

  1. 在需要列舉一下固定的對象
  2. 單例模式也可以使用。

4.使用枚舉類的優缺點

優點

  1. 創建對象方便。省去了創建對象的代碼,這些都已經是規定好的了。
  2. 便於管理。全部靜態對象都在枚舉類中,直接在枚舉類裏修改即可。

缺點

  1. 需要有語法基礎
  2. 初始化緩慢。靜態區的數據是在類加載的時候,就會去創建的。

二、枚舉類的使用

1.語法

  1. 需要將class換成enum
  2. 枚舉類的成員不能使用修飾符
  3. 枚舉類的成員後面可以直接接構造方法的參數
  4. 枚舉類的構造方法不能是public
  5. 枚舉類不能繼承和被繼承,但是可以實現接口

2.代碼

這就直接看上面的,枚舉類出現之後的代碼了。

三、枚舉類的實現

1.原理

其實,枚舉類跟普通的類是沒有任何區別的,只不過編譯器會自動地識別enum這個標識符,然後把它轉換成一個class

2.枚舉類的字節碼

讓我們看一下,我們剛剛編寫的枚舉類的字節碼是怎麼樣的

public final enum model/EnumPerson extends java/lang/Enum {
  // compiled from: EnumPerson.java
  // access flags 0x4019
  public final static enum Lmodel/EnumPerson; A
  // access flags 0x4019
  public final static enum Lmodel/EnumPerson; B

通過idea的view->show bytecode就可以看到了
我這裏就只截取了開頭的一部分內容,可以看出這裏默認繼承了一個Enum類,而且還有final標識符,這就是爲什麼枚舉類不能繼承和被繼承的原因了。
而我們創建的兩個對象就自動改成了public final static···一長串標識符聲明的對象,這不就跟在沒有出現枚舉類之前的代碼差不多嘛。

四、總結

枚舉類本質上和普通的class一樣,只不過java幫我們做了封裝。(跟語法糖的概念差不多)而,枚舉類中的對象都是枚舉類的實現
在需要一開始就創建而且不會再改變一系列對象時,就可以使用枚舉類。
語法

  1. 需要將class換成enum
  2. 枚舉類的成員不能使用修飾符
  3. 枚舉類的成員後面可以直接接構造方法的參數
  4. 枚舉類的構造方法不能是public
  5. 枚舉類不能繼承和被繼承,但是可以實現接口

——————————————————————————————
如果本文章內容有問題,請直接評論或者私信我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章