为什么需要枚举?
常量定义它不香吗?为啥非得用枚举?
静态常量:
public static final int SUCCESS = 1;
public static final int FAILURE = 0;
对于这种单值类型的静态常量定义,本身也没错,主要是在使用的地方没有一个明确性的约束而已
public void getCode(int code){
}
比如这里的 getCode 函数的本意是传入 code 的两种静态常量之一,但由于没有类型上的约束,因此传入任意一个int值都是可以的,编译器也不会提出任何警告。
但是在枚举类型出现之后,上面这种情况就可以用枚举严谨地去约束,比如用枚举去定义视频状态就非常简洁了:
枚举类:
public enum TypeEnum {
SUCCESS(1),
FAILURE(0)
;
private final int code;
TypeEnum(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
// 入参就有明确的约束
public void getCode(TypeEnum typeEnum){
}
这样在使用 getCode 函数时,入参类型就会受到明确的类型约束,一旦传入无效值,编译器就会帮我们检查,从而规避潜在问题。
除此之外,枚举在扩展性方面比普常量更方便、也更优雅。
枚举类型的常用方法| 方法名 | 具体含义 | 使用方法 |
| values() | 将枚举类型成员以数组的形式返回 | 枚举类.values() |
| valueOf() | 将普通字符串转换为枚举实例 | 枚举类.valueOf("ABC") |
| compareTo() | 比较两个枚举对象在定义时的顺序 | 枚举对象.compareTo() |
| ordinal() | 得到枚举成员的位置索引 | 枚举对象.ordinal() |
values()方法
该方法可以将枚举类型成员以数组的形式返回,也可以通过该方法获取枚举类型的成员。
测试枚举类
package com.yang.enums;
public enum ColorEnum {
BLUE("blue", "我是蓝色"),
RED("red", "我是红色"),
BLACK("black", "我是黑色"),
GREEN("green", "我是绿色");
private final String name;
private final String description;
ColorEnum(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public static String getDescription(String name) {
for (ColorEnum color : ColorEnum.values()) {
if (color.name.equals(name)) {
return color.getDescription();
}
}
return null;
}
}
// 遍历枚举类
public static void main(String[] args) {
// 方式一
for (ColorEnum colorEnum : ColorEnum.values()) {
System.out.println("枚举类型成员变量:" + colorEnum);
}
System.out.println("------------------------");
// 方式二
for (int i = 0; i < ColorEnum.values().length; i++) {
System.out.println("枚举类型成员变量:" + ColorEnum.values()[i]);
}
}
valueOf()与compareTo()方法
枚举类型中静态方法valueOf()可以实现将普通字符串转换为枚举实例,而compareTo()方法用于比较两个枚举对象在定义时的顺序。
public static void main(String[] args) {
// 将字符串转换成枚举实例
ColorEnum black = ColorEnum.valueOf("BLACK");
System.out.println(black);
System.out.println("------------------------");
// 比较顺序关系
compare(black);
}
public static void compare(ColorEnum colorEnum){
for (ColorEnum value : ColorEnum.values()) {
// compareTo()方法用于比较两个枚举对象在定义时的顺序
System.out.println(colorEnum + " 与 "+value + " 的比较结果为: "+colorEnum.compareTo(value));
}
}
说明:调用compareTo()方法返回的结果,正值代表方法中的参数在调用该方法的枚举对象位置之前;0代表两个相互比较的枚举成员的位置相同;负值代表方法中参数在调用该方法的枚举对象位置之后。
ordinal()方法
该方法用于得到枚举成员的位置索引。
public static void main(String[] args) {
// 获取枚举成员的位置索引
for (int i = 0; i < ColorEnum.values().length; i++) {
System.out.println(ColorEnum.values()[i] + "在枚举类型中位置索引值" + ColorEnum.values()[i].ordinal());
}
}
使用枚举类型的优势
枚举类型声明提供了一种用户友好的变量定义方法,枚举了某种数据类型所有可能出现的值。总结枚举类型,它具有以下特点:
(1)类型安全。
(2)紧凑有效的数据定义。
(3)可以和程序其他部分完美交互。
(4)运行效率高。



