本文介绍枚举类的概念和开发过程中枚举的用法。
枚举类使用enum关键字定义,enum默认继承自Enum类,由于java单继承的特点,enum类无法再继承其他父类
一、枚举类的特性
1、简单枚举类的定义
枚举类用关键字enum定义,成员变量之间用逗号分隔,最后一个成员变量用分号结束。枚举类的命名建议加上Enum后缀。
代码如下:
public enum FruitEnum { APPLE, ORANGE, BANANA, PEAR }
枚举的成员变量均为常量,可以通过FruitEnum.APPLE
调用,构造方法被默认强制是私有,禁止通过new关键字实例化。
枚举类自带values()方法可以返回该枚举的所有实例
2、添加自定义方法
枚举类继承自Enum,默认实现了很多常用方法,包括:toString(),compareTo(),equals(),hashCode()
等。
我们也可以给枚举类添加自定义方法,需要注意如下几点:
1、自定义方法必须在enum实例之后; 2、如果显示指明了构造方法,必须是默认(enum中默认既是私有)或私有 3、最后一个实例需要加分号
例如,给简单示例增加要给重写的toString()方法:
public enum FruitEnum { APPLE, ORANGE, BANANA, PEAR; @Override public String toString() { return "fruit:"+super.toString(); } }
3、实现构造函数
public enum FruitEnum { /** * description 苹果 **/ APPLE("苹果", 1), /** * description 橘子 **/ ORANGE("橘子", 2), /** * description 香蕉 **/ BANANA("香蕉", 3), /** * description 梨 **/ PEAR("梨", 4), /** * description 猕猴桃 **/ KIWI_FRUIT("猕猴桃", 5); private String description; private final Integer value; /** * description 构造函数 * param [description, value] **/ FruitEnum(String description, int value) { this.description = description; this.value = value; } /** * description 根据枚举值获取枚举对象 * param [value] * return com.company.enumtest.FruitEnum * author 郑晓龙 * createTime 2019/12/3 10:35 **/ public static FruitEnum getFruitEnumByValue(Integer value) { if (value == null) { return null; } for (FruitEnum fruitEnum : FruitEnum.values()) { if (fruitEnum.ordinal() == value) { return fruitEnum; } } throw new NoSuchElementException(); } public String getDescription() { return description; } public Integer getValue() { return value; } }
二、枚举的应用场景
1、switch语句中使用枚举
case语句中不需要写枚举类名,可以直接写枚举实例,例如:
FruitEnum fruit = FruitEnum.KIWI_FRUIT; switch (fruit){ case APPLE: System.out.println("get apple!"); break; case KIWI_FRUIT: System.out.println("get KIWI_FRUIT!"); break; default: System.out.println("default"); }
2、枚举实现单例模式
由于枚举天然的静态化和不可用new实例化,可以用于单例模式
public enum Singleton { INSTANCE; /** * description 无参构造函数(可以省略) **/ private Singleton(){ System.out.println("I'm singleton"); } public static void doSomething(){ System.out.println("I'm doing!"); } }
main方法中使用单例:
Singleton.doSomething(); Singleton.doSomething();
执行结果:
I'm singleton I'm doing! I'm doing!
可以看到,当Singleton类第一次被调用时,实例化了该单例类,并执行了方法,第二次直接执行了方法。
参考:
- 深入浅出单实例SINGLETON设计模式
- 《Java编程思想第四版》P590