最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入談?wù)刯ava的枚舉(enum)類型

 更新時間:2016年09月02日 15:11:05   投稿:daisy  
這篇文章介紹的是java中的枚舉類型,對于枚舉類型的相關(guān)知識,我們也介紹過不少方面的內(nèi)容。希望本文能夠給你帶來幫助,下面來一起看看,有需要的可以參考借鑒。

前言

在大家日常編程中,往往存在著這樣的“數(shù)據(jù)集”,它們的數(shù)值在程序中是穩(wěn)定的,而且“數(shù)據(jù)集”中的元素是有限的。例如星期一到星期日七個數(shù)據(jù)元素組成了一周的“數(shù)據(jù)集”,春夏秋冬四個數(shù)據(jù)元素組成了四季的“數(shù)據(jù)集”。在java中如何更好的使用這些“數(shù)據(jù)集”呢?因此枚舉便派上了用場

枚舉其實(shí)就是一種類型,跟int, char 這種差不多,就是定義變量時限制輸入的,你只能夠賦enum里面規(guī)定的值。

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

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

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

通過反編譯工具來看看這段代碼是如何實(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
  });
 }
}

通過反編譯的代碼可以發(fā)現(xiàn):

1、Season是一個普通的類,繼承自Enum,并通過final關(guān)鍵字修飾,避免被繼承,

2、枚舉中的SPRINGSUMMER、AUTUMNWINTERSeason類的靜態(tài)實(shí)例,并在類構(gòu)造器<clinit>方法中進(jìn)行初始化。

3、values()方法返回私有變量$VALUES[]的副本,$VALUES[]也是在<clinit>方法中進(jìn)行初始化。

如何使用枚舉(enum)

1、單例模式

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

public enum Singleton { INSTANCE;}

2、在switch中使用

3、自定義字段和方法

枚舉(enum)中除了默認(rèn)字段和方法之外,可以針對業(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.bind(1, 2);

總結(jié)

以上就是關(guān)于Java中枚舉類型的全部內(nèi)容了,希望通過本文對java中枚舉的介紹,能夠給大家?guī)韼椭?。如果有疑問大家可以留言交流?/p>

相關(guān)文章

最新評論

门源| 蓬安县| 甘孜县| 武穴市| 息烽县| 永福县| 昭平县| 武夷山市| 鱼台县| 遂昌县| 内丘县| 麦盖提县| 青河县| 鹤庆县| 百色市| 绍兴市| 黔南| 普格县| 栖霞市| 永济市| 德昌县| 山阴县| 株洲市| 伊吾县| 宝应县| 祁连县| 沂源县| 怀仁县| 合肥市| 贺州市| 离岛区| 海安县| 丹棱县| 华池县| 铁岭县| 德昌县| 阿克苏市| 大连市| 苏州市| 京山县| 丽江市|