Java中的枚举类型

Java中的枚举类型

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

你可能感兴趣的:(Java学习,java)