枚举是一个非常古老的语言特性,用来实现具名的有限集合,在 C/C++ 中使用广泛。而 Java 在 Java SE5 才引入枚举。也许语言设计者觉得既然是后引入该特性,那么一定要在这个特性上支持比其他语言更多的特性。这些特性的确让 Java 的枚举功能看起来更加“成熟”,同时也引入了一些复杂性,需要开发者关注。

枚举是一个不能继承的常规类

定义一个一周七天的枚举类型:

public enum EnumWeekDay {

Mon, Tue, Wed, Thu, Fri, Sat, Sun;

}

编译成 class 文件后反编译查看:

╰─➤ javap EnumWeekDay

Compiled from "EnumWeekDay.java"

public final class EnumWeekDay extends java.lang.Enum {

public static final EnumWeekDay Mon;

public static final EnumWeekDay Tue;

public static final EnumWeekDay Wed;

public static final EnumWeekDay Thu;

public static final EnumWeekDay Fri;

public static final EnumWeekDay Sat;

public static final EnumWeekDay Sun;

public static EnumWeekDay[] values();

public static EnumWeekDay valueOf(java.lang.String);

static {};

}

从反编译结果可知:枚举类型的关键字 enum 其实只是一个语法糖,编译器最终把它转化为一个final类,因此枚举是不可继承的。

枚举的每一个取值被编译器传化为了一个个 static final 属性。

本质上,这就是一个普通类,因此你可以在枚举是添加各种方法,甚至是main方法。

神奇的 values() 方法

从上面我们可以看出枚举类型被添加了一个静态的 values() 方法,但是 java.lang.Enum 并没有该方法。其实,这个方法是编译器添加的。通过这个方法可以获取到该枚举类型的所有取值。这个方法在需要遍历枚举取值,进行判断筛选的场景非常有用,可参考下例的 getByZhName 方法。

在枚举中保存其他信息

在 C 中,枚举可以简单的理解为具名的整型子集。Java 扩展了这个属性,使得可以在枚举中保存其他信息。

定义一个水果枚举类,并包含中文信息:

public enum EnumFruit {

APPLE("苹果"),

BANANA("香蕉"),

ORANGE("橘子");

private String zhName;

EnumFruit(String zhName) {

System.out.println("enum init:" + zhName);

this.zhName = zhName;

}

/**

* Getter method for property zhName.

*

* @return property value of zhName

*/

public String getZhName() {

return zhName;

}

public EnumFruit getByZhName(String zhName) {

for (EnumFruit fruit : values()) {

if (fruit.getZhName().equals(zhName)) {

return fruit;

}

}

return null;

}

}

使用这种方式定义枚举的方式需要注意:该枚举必须含有一个构造函数,且该构造函数必须是私有的。因为枚举就是常规类,而枚举对象就是具体的枚举实例,因此枚举有多少个取值,该构造函数就会被调用多少次:

public class EnumUser {

public static void main(String[] args) {

EnumFruit fruit = EnumFruit.APPLE;

System.out.println(fruit);

}

}

enum init:苹果

enum init:香蕉

enum init:橘子

APPLE

使用 EnumSet 和 EnumMap 提供性能

如果要在把枚举使用在 Set、Map 等集合场景,请使用 EnumSet 和 EnumMap。 EnumSet 使用了 bit vector 来标记元素,EnumMap 内部将 Map 实现简化为了数组,因此可以获得更好的性能。

小结

Java 的枚举语言特性作为一个后来者,的确带来了更加“成熟”和“丰富”的实现。但是,这些丰富的特性是否一定要在日常的项目中使用,我个人是不推荐的。就我个人理解,枚举最大的优点是类型和有限集合的约束,从而增强代码的一致性。因此,我提倡在项目代码中用 C 的枚举风格来使用 Java 枚举。此外,枚举并不是编程语言必须支持的特性,比如近段时间如日中天的 Golang 是不支持枚举的。既然是一个可有可无的语言特性,那就 use is as simple as possible 吧。

扩展阅读

java enum优点_你需要关注的 Java Enum 枚举的几个细节相关推荐

  1. java驱动pl sql优点_用PL/SQL和Java开发Oracle8i应用程序

    用PL/SQL和Java开发Oracle8 i应用程序 随着Oracle8i的发布,Oracle 在数据库里支持了二种主要的编程语言??PL/SQL和Java.今天,Oracle的许多客户既使用PL/ ...

  2. java 故障排查_目前最全的 Java 服务问题排查套路

    问题分类: CPU问题 内存问题(GC问题.内存泄漏. OOM,Coredump 等) I/O问题 问题排查工具箱: 系统级别的工具: top:查看系统/进程cpu.内存.swap等资源占用情况的必备 ...

  3. java吵醒线程_一文搞懂 Java 线程中断

    在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分 ...

  4. java布道师_初探第10代Java帝国:11位Java专家道出了他们最喜欢的功能

    Java 10发布后.我们第一时间与11位Java专家讨论了一波.顺便深入挖掘了他们在Java 10中最喜欢的功能和对未发布的JDK11版本的一些看法. " Java 10对Java 9来说 ...

  5. java coin介绍_代码示例中的Java 7:Project Coin

    java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...

  6. 手把手教安装java开发环境_手把手教你配置java开发环境-java环境变量设置

    在本篇中将为大家介绍如何在windows下搭建Java的开发环境. 话不多说,直接转入正题.下载java开发工具包JDK 下载地址:http://www.oracle.com/technetwork/ ...

  7. java arraylist排序_一文读懂Java集合框架

    欢迎关注微信公众号:深入浅出Java源码 概念 Java集合框架为程序员提供了预先包装的数据结构和算法来操纵他们.集合框架被设计成要满足以下几个目标. 该框架必须是高性能的.基本集合(动态数组,链表, ...

  8. java 输出中文_没见过的 Java 编程入门教程!例程使用中文标识符代码:问个好吧...

    前言 Java 教程用中文写(如下)更能被新手理解学习.可惜至今没有看到类似入门教程,在此敢为人先. 注意:本教程的所有 Java 代码都可以正确运行,因为 Java 早已支持中文命名标识符. 编程语 ...

  9. java怎么运行_不要再问我Java程序是怎么执行的了!

    什么是Java虚拟机? 要弄明白Java程序的执行过程首先要了解一下Java虚拟机. 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构 ...

最新文章

  1. ASP.NET Web页面(.aspx)添加用户控件(.ascx)无显示的问题
  2. 两个链表的第一个公共节点分析
  3. [置顶]       设计模式之创建类模式——原型模式
  4. 机器学习——利用K-均值聚类算法对未标注数据分组
  5. Visual C#创建Windows服务程序
  6. android studil打断点_【小技巧】AndroidStudio利用断点打印日志
  7. php本地怎么接受小程序图片,怎么把本地图片当作小程序背景
  8. retain、strong、weak、assign区别
  9. 睡眠 应该用 a加权 c加权_在神经网络中提取知识:学习用较小的模型学得更好...
  10. Java Calendar add()方法与示例
  11. mpvue 从零开始 女友初成长 0
  12. 2019阿里云618大促主会场全攻略
  13. html css网页布局实例简单,Div+CSS网页布局项目实战一(含设计图、HTML和CSS源文件)...
  14. 大数据之-Hadoop3.x_MapReduce_区内排序案例---大数据之hadoop3.x工作笔记0117
  15. 32驱动_轻松掌握pinctrl子系统驱动开发——一个虚拟pinctrl dev驱动开发
  16. 举个栗子~Tableau 技巧(205 ):区域地图中呈现具体位置
  17. cocos2dx游戏中添加背景音乐、音效
  18. 浏览器、html、css面试题(一)
  19. Mysql数据库的安装--三分钟搞定
  20. P3939 数颜色 主席树板子

热门文章

  1. [小技巧]ASP.NET Core中如何预压缩静态文件
  2. 程序猿修仙之路--数据结构之你是否真的懂数组?
  3. 拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc
  4. Android WebView 在内部打开链接,捕获错误
  5. 【专升本计算机】2021年甘肃省专升本计算机全真模拟试题(四)
  6. C# dataGridView隔行显示不同颜色
  7. C语言试题九十之实现输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
  8. linux之uniq命令
  9. linux c之动态打开链接库(dlopen dlsym dlclose)
  10. Android之用adb screencap -p命令截图