说说Java枚举类型

作者: 美团Java | 来源:发表于2016-09-01 20:32 被阅读5591次

简书 占小狼
转载请注明原创出处,谢谢!

enum实现

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

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

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

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、枚举中的SPRING、SUMMER、AUTUMN和WINTER是Season类的静态实例,并在类构造器<clinit>方法中进行初始化。
3、values()方法返回私有变量$VALUES[]的副本,$VALUES[]也是在<clinit>方法中进行初始化。

如何使用enum

1、单例模式
JVM类加载的那些事中,我们已经知道类构造器<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.operate(1, 2);

END。
我是占小狼。
在魔都艰苦奋斗,白天是上班族,晚上是知识服务工作者。
如果读完觉得有收获的话,记得关注和点赞哦。
非要打赏的话,我也是不会拒绝的。

相关文章

  • 说说Java枚举类型

    简书 占小狼转载请注明原创出处,谢谢! enum实现 JDK5中提供了Java枚举类型的实现,与其说是一种新类型,...

  • 枚举

    枚举 wiki Java的枚举类型用法介绍 深入理解Java枚举类型(enum) 为什么要用enum? 学习计划 ...

  • [Kotlin Tutorials 5] 枚举和Sealed C

    枚举和Sealed Class 枚举 首先, Kotlin和Java一样, 也是有枚举类型的: 枚举类型还可以实现...

  • Java中的枚举,这一篇全了,一些不为人知的干货

    Java枚举,也称作Java枚举类型,是一种字段由一组固定常量集合组成的类型。枚举的主要目的是加强编译时类型的安全...

  • java枚举类型

    Java中的枚举就像任何其他类一样,具有一组预定义的实例。 这里有几个例子来强调如何使用Java Enum。 1....

  • Java枚举类型

    一、枚举定义 枚举不能定义在静态方法中 一般自定义的枚举类型都属于Enum的子类型EnumType 它默认就有两个...

  • java枚举类型

    一. 枚举类型的定义 定义 java.lang.Enum是在JDK1.5定义的. 定义为: 编程规约: 阿里巴巴出...

  • Java中的枚举详解

    定义枚举 JDK1.5引入了一种新的数据类型枚举类型。Java使用关键字enum声明枚举类型,语法格式如下: en...

  • Java枚举总结

    Java枚举总结 枚举类型比较简单,下面两个文章讲的比较清楚: Java 枚举(enum) 详解7种常见的用法 深...

  • Java Enum

    Enum 类型的介绍 枚举类型是Java5新增的特性之一,枚举是一种特殊类型的类,其枚举的每一个值都是该枚举类的一...

网友评论

  • 9e437da98c60:厉害了
  • arborebmf:1、Season是一个普通的类,继承自Enum,并通过final关键字修饰,避免被继承

    如果Season有一个抽象的方法,每个Season枚举都需要实现该抽象方法,则通过abstract关键字修饰,那么就可以继承?。。。刚测试了下,像是TimeUnit
    美团Java:@arborebmf 对的
  • holysu:这个例子就是个 命令模式~
    hongrm:http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html#id1设计模式可以看这个:grin:
  • FTOLsXD:愿做你的粉,但是我们不约!
    美团Java:@FTOLsXD 哈哈,我也不约
  • c91dd259e18c:我也在魔都,实习生,啥都不让我做,好心累
    美团Java:@手电筒恩 那就多学点基本功
  • 磊哥小伙子:。 ,, ,, , ,, , , , ,。。 , ,。 , , 。 。, , ,。 。。,, , 。, , , ,, 。, , , ,, ,, , , , , , , ,, , , , 。 , , ,, , 。 。 。 , ,。 , , ,, 。 。 , 。, , , , , , ,, , , , , , , , ,, , ,, ,。 ,。 , , , , , ,, , , , , , , , , , 。 , , , , , , , , , 。 , , 。 , , , , , , 你们扭扭捏捏那你呢那你 那你呢
  • Tangmo:感谢分享,不过具体使用的时候是“int result = operation.operate(1, 2);”吧
    美团Java:@Tangmo 已修正
    Tangmo:@占小狼 :smile:
    美团Java:@Tangmo 对的,写错了,看得真认真
  • 鱼非雨:不错!
    美团Java:@鱼非雨 :sunglasses:

本文标题:说说Java枚举类型

本文链接:https://www.haomeiwen.com/subject/csgcettx.html