1.什么是枚举类?
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
Java 枚举类使用enum
关键字来定义,各个常量使用逗号 ,
来分割。
比如定义一个颜色枚举:
public enum ColorEnum {
GREEN,READ,BLUE;
public static void main(String[] args) {
ColorEnum colorEnum = ColorEnum.BLUE;
System.out.println(colorEnum);
}
}
输出结果:
BLUE
含有成员变量写法:
public enum Sex {
MAN("男",1),
WOMAN("女",0);
private final String desc;
private final int code;
Sex(String desc, int code) {
this.desc = desc;
this.code = code;
}
public String getDesc() {
return desc;
}
public int getCode() {
return code;
}
}
成员变量需要有对应的构造函数,枚举变量(成员变量1..),
2.枚举与类的区别
没有任何区别。通过反编译可以看到enum
定义的类型就是class
,只不过它有以下几个特点:
- 定义的
enum
类型总是继承自java.lang.Enum
,且无法被继承(反编译可以看到被final
修饰); - 只能定义出
enum
的实例,而无法通过new
操作符创建enum
的实例; - 定义的每个实例都是引用类型的唯一实例;
enum
的默认父类都默认实现了Serializable
接口,所以枚举都默认支持序列化
3.枚举中的常用方法
values
这个方法比较特殊,因为在Java
api文档中找不到这个方法,这个方法的作用是将枚举类型中的所有常量返回枚举数组,可以用于遍历所有的枚举值。举例如下:
public enum ColorEnum {
GREEN,READ,BLUE;
public static void main(String[] args) {
ColorEnum[] values = ColorEnum.values();
for (ColorEnum colorEnum : values) {
System.out.println(colorEnum);
}
}
}
输出结果:
GREEN
READ
BLUE
valueOf
valueOf(Stirng str)
可以把一个字符串转换为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。举例如下:
public enum ColorEnum {
GREEN,READ,BLUE;
public static void main(String[] args) {
ColorEnum colorEnum = ColorEnum.valueOf("GREEN");
System.out.println(colorEnum);
}
}
输出结果:
GREEN
name
name()
方法可以得到枚举常量的名称。举例如下:
public enum Sex {
/**
* 性别男
*/
MAN("男"),
/**
* 性别女
*/
WOMAN("女");
private final String value;
Sex(String value) {
this.value = value;
}
public static void main(String[] args) {
Sex sex = Sex.MAN;
System.out.println(sex.name());
}
}
输出结果:
MAN
orginal
ordinal()
可以得到当前枚举常量的次序。举例如下:
public enum ColorEnum {
GREEN,READ,BLUE;
public static void main(String[] args) {
ColorEnum colorEnum = ColorEnum.valueOf("READ");
System.out.println(colorEnum.ordinal());
}
}
输出结果:
1
方法汇总
4.枚举中的一些用法
在switch中使用
举例如下:
public enum Sex {
/**
* 性别男
*/
MAN("男"),
/**
* 性别女
*/
WOMAN("女");
private final String value;
Sex(String value) {
this.value = value;
}
public static void main(String[] args) {
Sex sex = Sex.MAN;
System.out.println(sex.name());
switch (sex){
case MAN:
System.out.println("男性");
break;
case WOMAN:
System.out.println("女性");
break;
}
}
}
输出结果:
男性
实现接口
所有的枚举都继承自java.lang.Enum
类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。但是可以实现接口。举例如下:
public enum ColorEnum implements Behaviour{
GREEN,READ,BLUE;
public static void main(String[] args) {
ColorEnum colorEnum = ColorEnum.valueOf("READ");
colorEnum.method();
}
@Override
public void method() {
System.out.println("实现接口中的方法");
}
}
interface Behaviour {
void method();
}
用接口组织枚举
比如我们定义一个玩游戏的接口,我们可以在接口中用枚举指定玩游戏的类型:
public interface Playing {
enum GameEnum{
ACTION("动作类"),
ADVENTURE("冒险类"),
CASUAL("休闲类");
private final String type;
GameEnum(String type) {
this.type = type;
}
}
}
枚举中的集合类
EnumSet
EnumSet
为把枚举类型存储到Set
集合中,举例如下:
public enum ColorEnum{
GREEN,READ,BLUE;
public static void main(String[] args) {
EnumSet<ColorEnum> colorEnums = EnumSet.allOf(ColorEnum.class);
System.out.println(colorEnums);
}
}
输出结果:
[GREEN, READ, BLUE]
EnumMap
EnumMap
是一种把枚举类型当做Map
的key的一种特殊类型。举例如下:
public enum ColorEnum{
GREEN,READ,BLUE;
public static void main(String[] args) {
EnumMap<ColorEnum, String> enumMap = new EnumMap<>(ColorEnum.class);
enumMap.put(ColorEnum.BLUE,"蓝色");
enumMap.put(ColorEnum.READ,"红色");
enumMap.put(ColorEnum.GREEN,"绿色");
enumMap.forEach((key,value)-> System.out.println(key+"--"+value));
}
}
输出如下:
GREEN--绿色
READ--红色
BLUE--蓝色
5.枚举类中的使用建议
- 枚举类中的构造方法用不能加
public
修饰,因为它默认是单例的(默认使用private
),不允许外部以创建对象的方式生成枚举对象 - 字段强烈建议声明为
final
,只允许获取,不允许修改 - 枚举类名带上
Enum
后缀,枚举成员名称需要大写,单词间用下划线隔开 - 枚举类型几乎是固定不变的全局常量,使用频率高、范围广,所以枚举常量都需要添加清晰的注释。
举例code:
public enum SexEnum {
/**
* 性别男
*/
MAN("男"),
/**
* 性别女
*/
WOMAN("女");
private final String value;
SexEnum(String value) {
this.value = value;
}
}
参考:
- https://www.runoob.com/java/java-enum.html
- https://blog.csdn.net/qq_26676207/article/details/80405497
- https://www.liaoxuefeng.com/wiki/1252599548343744/1260473188087424
- https://www.jb51.net/article/96631.htm
- 《阿里巴巴开发手册》