Java基礎(chǔ)-枚舉

一、枚舉類型

enum SeasonEnum {
    SPRING,SUMMER,FALL,WINTER;
}

枚舉類的常用方法

  • name(); 返回enum實例聲明時的名字。
  • ordinal(); 返回一個int值,表示enum實例在聲明的次序。
  • equals(); 返回布爾值,enum實例判斷相等
  • compareTo() 比較enum實例與指定對象的順序
  • values(); 返回enum實例的數(shù)組
  • valueOf(String name) 由名稱獲取枚舉類中定義的常量

枚舉類的真面目

用javap查看一個枚舉類的字節(jié)碼

Compiled from "Shrubbery.java"
public final class enumtest.Shrubbery extends java.lang.Enum<enumtest.Shrubbery> {
  public static final enumtest.Shrubbery GROUND;
  public static final enumtest.Shrubbery CRAWLING;
  public static final enumtest.Shrubbery HANGING;
  public static enumtest.Shrubbery[] values();
  public static enumtest.Shrubbery valueOf(java.lang.String);
  static {};
}
  • Shrubbery枚舉變成了一個final修飾的類,也就是說,它不能被繼承啦。
  • Shrubbery是java.lang.Enum的子類。
  • Shrubbery定義的枚舉值都是public static final修飾的,即都是靜態(tài)常量。
  • 當(dāng)一個Java類第一次被真正使用到的時候靜態(tài)資源被初始化、Java類的加載和初始化過程都是線程安全的。

向枚舉中添加新的方法

因為枚舉本質(zhì)上就是Enum的子類,所以可以給他添加任意的方法。

public enum OrderStatusEnum {
    UNPAID(0, "未付款"), PAID(1, "已付款"), SENDED(2, "已發(fā)貨"), FINISH(3, "已完成"),;

    //成員變量
    private int index;
    private String desc;

    //get方法
    public int getIndex() {
        return index;
    }

    public String getDesc() {
        return desc;
    }

    //構(gòu)造器方法
     OrderStatusEnum(int index, String desc) {
        this.index = index;
        this.desc = desc;
    }

    //普通方法
    public static OrderStatusEnum of(int index){
        for (OrderStatusEnum temp : values()) {
            if (temp.getIndex() == index) {
                return temp;
            }
        }
        return null;
    }
}

枚舉實現(xiàn)接口

所有枚舉類都繼承于java.lang.Enum,所以枚舉不能再繼承其他類了。但是枚舉可以實現(xiàn)接口

public interface ISeasonBehaviour {

    void showSeasonBeauty();

    String getSeasonName();
}

public enum SeasonEnum implements ISeasonBehaviour {
    SPRING(1,"春天"),SUMMER(2,"夏天"),FALL(3,"秋天"),WINTER(4,"冬天"),
    ;

    private int index;
    private String name;

    SeasonEnum(int index, String name) {
        this.index = index;
        this.name = name;
    }

    public int getIndex() {
        return index;
    }
    public String getName() {
        return name;
    }

    //接口方法
    @Override
    public void showSeasonBeauty() {
        System.out.println("welcome to " + this.name);
    }

    //接口方法
    @Override
    public String getSeasonName() {
        return this.name;
    }
}

枚舉類比較是用==還是equals

不管用==還是equals,都是可以的。其實枚舉的equals方法,就是用==比較的.

枚舉實現(xiàn)的單例

  • 枚舉單例寫法簡單
  • 枚舉可解決線程安全問題
  • 枚舉可解決反序列化會破壞單例的問題
public class SingletonEnumTest {
   public enum SingletonEnum {
        INSTANCE,;
        private String name;

        public String getName() {
            return name;
        }

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

    public static void main(String[] args) {
        SingletonEnum.INSTANCE.setName("jay@huaxiao");
        System.out.println(SingletonEnum.INSTANCE.getName());
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容