枚举是在JDK1.5之后引入的. 主要的用途是 :将一组常量组织起来,在这之前表示一组常量通常使用定义常量的方式.
public static final int RED = 1;
public static final int GREEN = 2;
public static final int BLACK = 3;
但是常量举例有不好的地方,例如 : 可能碰巧有个数字 1 ,但是他可能误以为四RED,现在我们可以直接使用枚举来对常量进行组织,这样一来,就拥有了类型,而不是普通的整型 1 .
public enum TestEnum{
RED,BLACK,GREEN;//枚举对象
}
优点 : 将常量组织起来统一进行管理
场景 : 错误状态码,消息类型,颜色的划分,状态机等等…
本质 : 是java.lang.Enum 的子类,也就是说,我们自己写的枚举类,就算没有显式的继承Enum,但是默认继承了Enum这个类
1.switch语句
public class TestEnum {
public static void main(String[] args) {
Color color = Color.BLACK;
switch(color){
case RED :
System.out.println("red");
break;
case BLACK:
System.out.println("black");
break;
case GREEN:
System.out.println("green");
break;
case WHITE:
System.out.println("white");
break;
default:
break;
}
}
}
public enum Color {
RED,BLACK,GREEN,WHITE;
}
2.常用方法
Enum类的常用方法
方法名称 | 描述 |
---|---|
values() | 以数组的形式返回枚举类型的所有成员 |
ordinal() | 获取枚举成员的索引位置 |
valueOf() | 将普通字符串转换成枚举实例 |
compareTo() | 比较两个枚举成员变量在定义时的顺序 |
示例一:
示例二:
示例三:
枚举在newInstance()这个方法会提前判断,如果是枚举那么就会抛出一个异常,并且输出一段话"枚举对象不能反射"
所以枚举在这个二分法中被过滤了,你不能通过反射获取枚举类的实例!这道题是2017年阿里巴巴曾经问到的一个问题,原版的问题是为什么枚举实现单例模式是安全的?
枚举本身就是一个类,其构造方法默认为私有的,且所有自定一的枚举类都是默认继承 java.lang.Enum
枚举可以避免反射和序列化的问题
枚举的优点和缺点
枚举(Enumeration)是一种常用的编程技巧,用于列举一组常量或有限的离散选项。枚举的优点和缺点如下:
优点:
可读性强:枚举提供了一种更具可读性的方式来表示一组相关的常量。这使得代码更容易理解和维护。
类型安全: 枚举在编译时会进行类型检查,这有助于捕获一些潜在的编程错误。使用枚举可以避免意外地使用不正确的常量值。
减少硬编码:枚举减少了在代码中硬编码常量值的需求。这可以提高代码的可维护性,因为如果需要修改常量值,只需要修改枚举定义而不必在整个代码中寻找和替换。
自动编号:枚举成员通常会自动获得递增的整数值,这可以简化代码,因为您不必手动为每个成员分配值。
IDE支持: 集成开发环境(IDE)通常会提供有关枚举的自动补全和文档,从而提高开发效率。
缺点
有限性:枚举只适用于表示有限的常量集合,如果需要表示大量的离散值或动态生成的值,枚举就不适用。
不适用于位掩码:*枚举成员通常是整数值,但它们不适用于位掩码操作,这可能需要使用整数常量或枚举类的位标志。
不易扩展: 如果需要在枚举中添加新成员,这可能需要修改并重新编译现有的代码。这在某些情况下可能不方便,尤其是在涉及多个代码库或模块的大型项目中。
不灵活:枚举成员的值通常在编译时确定,这意味着它们不适用于需要在运行时根据条件或外部数据进行动态设置的情况。
新成员,这可能需要修改并重新编译现有的代码。这在某些情况下可能不方便,尤其是在涉及多个代码库或模块的大型项目中。