简述

首先,枚举类型本质上是作为一种类的存在。对,它就是一种类,所以理解它的时候要对比着类的代码,按照类的思维来思考。

一般来说,最原始的它长这个亚子:

enum Festival{}

enum是定义枚举类型的关键字。显然,这是一个缩写,全拼为:enumeration。就是枚举的意思。
Festival的位置是枚举类型的类名,这里以Festival举例。

来类比一下类的定义:

class Festival{}

很好理解,不多赘述。

枚举实例常量

在说这点时,需要注意到,枚举类型的产生,一个很重要的目的就是为了解决常量的定义方式。所以枚举类型的内容应该是围绕着常量展开的。

先来看常量的定义方式:

enum Festival
{
	CHRISTMAS, NATIONAL_DAY, MOTHER_DAY;
}

对于在枚举类型中定义的常量,需要明确的是:

  • 这里的常量本质上是枚举类型的实例对象
  • 它们默认被final static public修饰
  • 在定义是,它们必须处于枚举类型代码块中的非注释首行。

可以不太严谨的比作类的如下写法:

class Festival
{
	public static final Festival CHRISTMAS = new Festival();
	public static final Festival NATIONAL_DAY = new Festival();
	public static final Festival MOTHER_DAY = new Festival();
}

可以看到,这些枚举类型中的常量,是全局静态实例常量,这些常量,就是枚举实例

当然,枚举类作为一种类,当然不可能只有静态常量,相对应的成员变量以及方法也是存在的。
(没有成员变量和方法的对象就是一个空壳子,显然我们都不希望看到)

成员变量和方法

在枚举类型中,可以定义成员变量和方法,为对象增添内容。
例如,对于节日枚举类型,我为其补充定义中文名称和一个方法:

enum Festival
{
	CHRISTMAS, NATIONAL_DAY, MOTHER_DAY;
	
	private String chineseName;
	
	public void print()
	{
		System.out.println("这个节日是:" + chineseName);
	}
}

当然,这些写法和在类中没有区别所以不需要对比区分,也就不再展示类的写法了。
(补充:由于枚举类型枚举的是常量,所以原则上不允许外界改变内部成员值,代码中成员变量的权限应设定为私有,不应向外界提供set方法。为节省篇幅这里并未给出它的get方法,)

到这里,还需要接着解决一个问题。就是对成员变量的值的设置,也就是初始化。

构造方法

从上面的例子中不难看到,这些常量包含的成员并没有一个初始化的过程。实际上,正如第一个例子所表述的那样,直接写名称定义常量,实际上是调用了默认的构造方法。也就相当于啥也没构造。

在枚举类型中,可以提供构造方法,并在创建实例对象的时候调用它:

enum Festival
{
	CHRISTMAS("圣诞节"), NATIONAL_DAY("国庆节"), MOTHER_DAY("母亲节");
	
	private String chineseName;
	
	private Festival(String name)
	{
		this.chineseName = name;
	}
	
	public void print()
	{
		System.out.println("这个节日是:" + chineseName);
	}
}

构造方法可以写多个,使用的时候在对应常量后面跟上括号传递参数即可。

需要注意的是,构造方法的权限必须是私有

还有一点需要注意,没有构造方法时,默认存在一个空的构造方法。重载构造方法,会覆盖默认的构造方法,所以若存在构造方法,则不会默认存在空构造方法

于是可以得到以下的构造方法的错误食用

构造方法共有

java 枚举如何注入bean java 枚举类型入参_枚举类型

缺少空构造方法

java 枚举如何注入bean java 枚举类型入参_java_02

常用方法

最后,需要理清枚举类型的继承关系,及其常用方法。

首先,枚举类型是一个类,继承于java.lang.Enum。

打开源码大纲可以发现对外开放的几个公有方法:

java 枚举如何注入bean java 枚举类型入参_java_03


对类来说,常用到的是静态方法valueOf,可以将普通的字符串转换为枚举实例。

对枚举实例,常用的是compareTo比较方法,以及ordinal方法,该方法可以用于获得枚举对象的位置索引。

除去这些方法,对于具体的枚举类,还有获得其所有成员的静态类方法:values

java 枚举如何注入bean java 枚举类型入参_构造方法_04


以数组的形式返回所有的常量。

优点

最后,来点老生常谈的,说说枚举类型的优点。摘几句书上的内容同大家分享:

  • 类型安全
  • 紧凑有效的数据定义
  • 可以和程序其他部分完美交互
  • 运行效率高