最近刚学习了枚举类型,写篇博客总结分享一发我的理解,如有不妥之处,请多指教。
简述
首先,枚举类型本质上是作为一种类的存在。对,它就是一种类,所以理解它的时候要对比着类的代码,按照类的思维来思考。
一般来说,最原始的它长这个亚子:
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.lang.Enum。
打开源码大纲可以发现对外开放的几个公有方法:
对类来说,常用到的是静态方法valueOf,可以将普通的字符串转换为枚举实例。
对枚举实例,常用的是compareTo比较方法,以及ordinal方法,该方法可以用于获得枚举对象的位置索引。
除去这些方法,对于具体的枚举类,还有获得其所有成员的静态类方法:values
以数组的形式返回所有的常量。
优点
最后,来点老生常谈的,说说枚举类型的优点。摘几句书上的内容同大家分享:
- 类型安全
- 紧凑有效的数据定义
- 可以和程序其他部分完美交互
- 运行效率高