Java中的枚举(Enum / Enumerations)是一种特殊的数据类型,用于定义一组具名的常量。枚举常量在代码中可以像其他变量一样使用,并且可以有自己的方法和属性。是在Java 5版本中引入的。【Java 5和JDK 1.5是指同一个版本,2004年9月发布】
枚举类型在代码中可以提供更好的可读性和类型安全性,常用于表示一组相关的常量。
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一年的 12 个月份,一个星期的 7 天等。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。使用规则:
枚举类型使用enum关键字进行定义,例如:enum Color { RED, GREEN, BLUE }。
枚举常量通常使用大写字母命名,多个常量之间用逗号分隔。
枚举类型可以包含字段、方法和构造函数。
枚举常量可以通过枚举类型的名称和常量名称进行访问,例如:Color.RED。
枚举类型可以实现接口,但不能继承其他类。
一个简单完整示例:
//枚举类 Color 颜色常量有 RED, GREEN, BLUE,分别表示红色,绿色,蓝色
enum Color
{
RED, GREEN, BLUE;
}
public class Test
{
// 执行输出结果
public static void main(String[] args)
{
Color c1 = Color.RED;
System.out.println(c1);
}
}
执行以上代码输出结果为:
RED
枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的 bug,方便很多场景使用。枚举类型提供了一种更清晰、更安全的方式来表示一组有限的常量,并且可以方便地进行比较和操作。Java枚举的使用场景包括但不限于:
☆表示状态:当一个对象有多个固定的状态时,可以使用枚举来表示。
☆表示选项和设置:当有一组固定的选项或配置设置时,可以使用枚举来表示。
☆表示命令:当定义一组命令时,可以使用枚举来表示。
☆表示星期和月份:表示时间单位,如星期几或月份。
☆错误代码:定义一组可能的错误代码。
☆单例模式:枚举可以用来实现单例模式。
枚举类型的使用可以提高代码的可读性和可维护性,并且可以在编译时提供类型安全检查。
可以使用点号(.)来访问枚举常量。
枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。
枚举既可以包含具体方法,也可以包含抽象方法。 如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它。例如:
enum Color
{
RED, GREEN, BLUE;
// 构造函数
private Color()
{
System.out.println("Constructor called for : " + this.toString());
}
public void colorInfo()
{
System.out.println("Universal Color");
}
}
public class Test
{
// 输出
public static void main(String[] args)
{
Color c1 = Color.RED;
System.out.println(c1);
c1.colorInfo();
}
}
执行以上代码输出结果为:
Constructor called for : RED
Constructor called for : GREEN
Constructor called for : BLUE
RED
Universal Color
枚举(enum)在Java中也是一种引用类型。下面是一个使用枚举的例子,它演示了如何通过赋值和方法参数传递枚举类型的引用。例如:
//定义一个简单的枚举类型,表示交通信号灯的状态:
public enum TrafficSignal {
RED,
GREEN,
YELLOW
}
//创建一个类,其中包含一个方法来改变信号灯的状态:
public class EnumExample {
public static void main(String[] args) {
TrafficSignal signal = TrafficSignal.RED; // 初始化信号灯状态为红色
System.out.println("Before change, signal = " + signal);
changeSignal(signal); // 尝试在方法中改变信号灯状态
System.out.println("After change, signal = " + signal);
}
public static void changeSignal(TrafficSignal signal) {
signal = TrafficSignal.GREEN; // 尝试改变信号灯状态为绿色
// 注意:这里的改变只影响方法内部的signal引用,不会改变原始signal变量的值
}
}
运行输出结果是:
Before change, signal = RED
After change, signal = RED
解析:rafficSignal是一个引用类型,但在changeSignal方法中对signal的改变并没有影响到原始的signal变量。这是因为Java中的方法参数传递是按值传递的,即使对于引用类型,传递的也是引用的值(即地址的副本),而不是实际的引用本身。所以在changeSignal方法中,我们只是改变了参数的副本,而不是原始的枚举变量。
要注意的是,如果枚举类型有属性并且这些属性是可变的(虽然这通常不是一个好的设计,因为枚举通常应该是不可变的),那么通过方法参数传递可以改变这些属性的状态。但是,通常建议枚举的每个元素是不可变的。
附录
https://mp.weixin.qq.com/s/mAhiQcBOCKT9MnT6sNS3BQ
https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html