深入谈谈java的枚举(enum)类型

前言

在大家日常编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在java中如何更好的使用这些“数据集”呢?因此枚举便派上了用场

枚举其实就是一种类型,跟int, char 这种差不多,就是定义变量时限制输入的,你只能够赋enum里面规定的值。

枚举(enum)实现

JDK5中提供了Java枚举类型的实现,与其说是一种新类型,倒不如说是一种语法糖。

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

通过反编译工具来看看这段代码是如何实现的,反编译后的代码如下:

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
  });
 }
}

通过反编译的代码可以发现:

1、Season是一个普通的类,继承自Enum,并通过final关键字修饰,避免被继承,

2、枚举中的SPRINGSUMMERAUTUMNWINTERSeason类的静态实例,并在类构造器<clinit>方法中进行初始化。

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

如何使用枚举(enum)

1、单例模式

我们已经知道类构造器<clinit>只能被一个线程在类加载的初始化阶段进行执行,所以枚举的每个实例在Java堆中有且只有一个副本,这种特性让枚举很容易就实现了单例模式,这也正是Effective Java作者 Josh Bloch 提倡使用实现单利模式的方式。

public enum Singleton { INSTANCE;}

2、在switch中使用

3、自定义字段和方法

枚举(enum)中除了默认字段和方法之外,可以针对业务逻辑进行自定义。

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、实现接口

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;
 }
}

在实际应用中,可以把 "+"、"-" 作为key,PLUS和SUB作为value,预先保存在hashMap中,具体使用方式如下:

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

总结

以上就是关于Java中枚举类型的全部内容了,希望通过本文对java中枚举的介绍,能够给大家带来帮助。如果有疑问大家可以留言交流。

(0)

相关推荐

  • Java枚举类enum介绍

    枚举类enum是JDK1.5引入的,之前都是用public static final int enum_value来代替枚举类的.枚举类enum是一种特殊的类,它默认继承了类java.lang.Enum.和其它普通类一样,enum同样可以有成员变量.方法.构造器,也可以实现一个或多个接口,区别是: 1.如果有构造器,必须用private修饰. 2.枚举类不能派生子类. 3.枚举类所有的实例必须在第一行显示定义.系统会自动给这些实例加上public static final修饰,无须程序员显示定义

  • java中enum的用法

    本文实例讲述了java中enum的用法.分享给大家供大家参考.具体分析如下: 1. 基本用法 复制代码 代码如下: enum Day {     SUNDAY, MONDAY, TUESDAY, WENDSDAY, THURSDAY, FRIDAY, SATURDAY; } 枚举是常量,所以应该用大写. 2. 枚举是对象 枚举隐含地继承了java.lang.Enum,所以它具有java.lang.Enum的属性和方法.遍历枚举: 复制代码 代码如下: public class Main {   

  • 全面解读Java中的枚举类型enum的使用

    关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始switch,可是我想说,我代码里头来源的数据不太可能就是枚举,通常是字符串或数字,比如一个SQL我解析后首先判定SQL类型,通过截取SQL的token,截取出来可能是SELECT.DELETE.UPDATE.INSERT.ALTER等等,但是都是字符串,此时我想用枚举就不行了,我要将字符串转换成枚举怎么转呢,类似的情况还有从数据库取出数据根据一些类型做判定,从页面传入数据,根据不同的类型做不同的操作,但是都是字符串,不是枚举,悲剧的是我很

  • Java enum关键字不识别的快速解决办法

    从别人那儿拷贝过来的myeclipse java工程,打开一看标红了一大片,仔细一看,原来是不识别enum关键字,这就有点尴尬了. 我自己重新建了一个java工程,测试了下,假如我在新建工程的时候选择JavaSE-1.6: 是识别enum关键字的,但是假如我选择第二个或者默认的jdk1.8,那就不行了,后来发现java compiler compliance level中的最高上限也才1.7,所以,两种解决方法(原理是一样的),一是将compiler compliance level设置到1.5

  • Java枚举类型enum的详解及使用

     Java枚举类型enum的详解及使用 最近跟同事讨论问题的时候,突然同事提到我们为什么Java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum 定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义.既然不明白就抽时间研究下吧. Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型.要了解枚举类型,建议大

  • Java Enum的简单使用

    最近为了便于对状态码的描述信息进行解析,学习了一下Enum的使用,发现还挺好使的. 首先,定义一个Enum的类Status,有两个属性statusValue状态码 以及 statusDesc状态描述 public enum Status { STATUS_OK("01","成功"), STATUS_FAILED("02","失败"), STATUS_NOTHING("03","未知状态"

  • Java(enum)枚举用法详解

    概念 enum的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum 关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, GREEN, BLUE } 如果枚举不添加任何方法,枚举值默认为从0开始的有序数值.以 Color 枚举类型举例,它的枚举常量依次为RED:0,GREEN:1,BLUE:2 枚举的好处:可以将常量组织起来,统一进行管理. 枚举的典型应用场景:错误码.状态机等. 枚举类型的本质 尽管enum 看起来像是一种

  • 三分钟快速掌握Java中枚举(enum)

    什么是枚举? 枚举是JDK5引入的新特性.在某些情况下,一个类的对象是固定的,就可以定义为枚举.在实际使用中,枚举类型也可以作为一种规范,保障程序参数安全.枚举有以下特点: Java中枚举和类.接口的级别相同. 枚举和类一样,都有自己的属性.方法.构造方法,不同点是:枚举的构造方法只能是private修饰,也就无法从外部构造对象.构造方法只在构造枚举值时调用. 使用enum关键字声明一个枚举类型时,就默认继承自Java中的 java.lang.Enum类,并实现了java.lang.Seriab

  • 详解Java中的迭代迭代器Iterator与枚举器Enumeration

    迭代器Iterator接口 1.迭代器接口 Iterable 内置方法iterator(), 返回一个新建的 Iterator. 如: public interface Iterable { Iterator Iterator(); } Iterator 有 hasNext() 和 next() 两个方法要实现. public interface Iterator { boolean hasNext(); Item next(); void remove(); //可选实现 } 2.实现 导入

  • Java枚举(enum) 详解7种常见的用法

    JDK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便.  用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switch JDK1.6之前的switch语句只支持int

随机推荐