說(shuō)說(shuō)Java枚舉類(lèi)型

簡(jiǎn)書(shū) 占小狼
轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!

enum實(shí)現(xiàn)

JDK5中提供了Java枚舉類(lèi)型的實(shí)現(xiàn),與其說(shuō)是一種新類(lèi)型,倒不如說(shuō)是一種語(yǔ)法糖。

public enum Season {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER
}

通過(guò)反編譯工具 jad來(lái)看看這段代碼是如何實(shí)現(xiàn)的,反編譯后的代碼如下:

public final class Season extends Enum {

    public static Season[] values() {
        return (Season[])$VALUES.clone();
    }

    public static Season valueOf(String s) {
        return (Season)Enum.valueOf(Season, s);
    }

    private Season(String s, int i) {
        super(s, i);
    }

    public static final Season SPRING;
    public static final Season SUMMER;
    public static final Season AUTUMN;
    public static final Season WINTER;
    private static final Season $VALUES[];

    static {
        SPRING = new Season("SPRING", 0);
        SUMMER = new Season("SUMMER", 1);
        AUTUMN = new Season("AUTUMN", 2);
        WINTER = new Season("WINTER", 3);
        $VALUES = (new Season[] {
            SPRING, SUMMER, AUTUMN, WINTER
        });
    }
}

通過(guò)反編譯的代碼可以發(fā)現(xiàn):
1、Season是一個(gè)普通的類(lèi),繼承自Enum,并通過(guò)final關(guān)鍵字修飾,避免被繼承,
2、枚舉中的SPRING、SUMMER、AUTUMN和WINTER是Season類(lèi)的靜態(tài)實(shí)例,并在類(lèi)構(gòu)造器<clinit>方法中進(jìn)行初始化。
3、values()方法返回私有變量$VALUES[]的副本,$VALUES[]也是在<clinit>方法中進(jìn)行初始化。

如何使用enum

1、單例模式
JVM類(lèi)加載的那些事中,我們已經(jīng)知道類(lèi)構(gòu)造器<clinit>只能被一個(gè)線(xiàn)程在類(lèi)加載的初始化階段進(jìn)行執(zhí)行,所以枚舉的每個(gè)實(shí)例在Java堆中有且只有一個(gè)副本,這種特性讓枚舉很容易就實(shí)現(xiàn)了單例模式,這也正是Effective Java作者 Josh Bloch 提倡使用實(shí)現(xiàn)單利模式的方式。

public enum Singleton { INSTANCE;}

2、在switch中使用
3、自定義字段和方法
enum中除了默認(rèn)字段和方法之外,可以針對(duì)業(yè)務(wù)邏輯進(jìn)行自定義。

public enum EnumTest {
  PLUS("+") {
      @Override
      public int bind(int arg1, int arg2) {
          return arg1 + arg2;
      }
  },
  SUB("-") {
      @Override
      public int bind(int arg1, int arg2) {
          return arg1 - arg2;
      }
  };

  final String operation;

  EnumTest(String operation) {
      this.operation = operation;
  }

  abstract int bind(int arg1, int arg2);
}

4、實(shí)現(xiàn)接口

interface Operation{
    int operate(int arg1, int arg2);
}

public enum EnumTest implements Operation {

    PLUS("+") {
        @Override
        public int operate(int arg1, int arg2) {
            return arg1 + arg2;
        }
    },
    SUB("-") {
        @Override
        public int operate(int arg1, int arg2) {
            return arg1 - arg2;
        }
    };

    final String operation;

    EnumTest(String operation) {
        this.operation = operation;
    }
}

在實(shí)際應(yīng)用中,可以把 "+"、"-" 作為key,PLUS和SUB作為value,預(yù)先保存在hashMap中,具體使用方式如下:

Operation operation = hashMap.get("+");
int result = operation.operate(1, 2);

END。
我是占小狼。
在魔都艱苦奮斗,白天是上班族,晚上是知識(shí)服務(wù)工作者。
如果讀完覺(jué)得有收獲的話(huà),記得關(guān)注和點(diǎn)贊哦。
非要打賞的話(huà),我也是不會(huì)拒絕的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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