Java 枚举

本文介绍了Java枚举的基础概念,展示了如何定义和使用枚举类型,包括枚举成员、方法及构造函数的使用,并通过示例解释了枚举类型在switch语句中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 枚举

枚举是一种特殊类型的数据使得其能够成为一个变量,值是一组预定义的常量,变量值必须等于为其预定义的值之一。
常见示例包括方向(NORTH,SOUTH,EAST和WEST的值)和星期几
因为它们是常量,所以枚举类型字段的名称是大写字母

1.使用

使用enum关键字定义枚举类型。
例如,可以将星期几的枚举类型指定为:

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY 
}

1.1 使用说明

枚举类主体可以包括方法其他字段
编译器在创建枚举时会自动添加一些特殊方法
例如,它们有一个静态values方法,它按照声明的顺序返回一个包含枚举值的所有值的数组。
此方法通常与for-each构造结合使用,以迭代枚举类型的值。
例如,Planet下面的类示例中的代码迭代太阳系中的所有行星。

for (Planet p : Planet.values()) {
    System.out.printf("Your weight on %s is %f%n", p, p.surfaceWeight(mass));
}

注意:所有枚举都隐式扩展java.lang.Enum。因为类只能扩展一个父类(请参阅 声明类),
所以Java语言不支持多重继承状态(请参阅 状态,实现和类型的多重继承),因此枚举不能扩展其他任何内容。

在以下示例中,Planet是一个枚举类型,表示太阳系中的行星,它们具有恒定的质量半径属性
每个枚举常量都声明为质量半径参数的值,创建常量时,这些值将传递给构造函数。
Java要求在任何字段或方法之前首先定义常量,此外,当存在字段和方法时,枚举常量列表必须以分号结尾

注意:枚举类型的构造函数必须是包私有或私有访问。它会自动创建在枚举主体开头定义的常量。您不能自己调用​​枚举构造函数。

除了它的属性和构造函数之外,Planet还有一些方法可以让你检索每个行星上一个物体的表面重力和重量。
这是一个示例程序,它可以减轻地球上的重量(在任何单位)并计算并打印所有行星上的重量(在同一单位):

public enum Planet {
    MERCURY(3.303e+23, 2.4397e6),
    VENUS(4.869e+24, 6.0518e6),
    EARTH(5.976e+24, 6.37814e6),
    MARS(6.421e+23, 3.3972e6),
    JUPITER(1.9e+27, 7.1492e7),
    SATURN(5.688e+26, 6.0268e7),
    URANUS(8.686e+25, 2.5559e7),
    NEPTUNE(1.024e+26, 2.4746e7);

    private final double mass;   // in kilograms
    private final double radius; // in meters

    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    private double mass() {
        return mass;
    }

    private double radius() {
        return radius;
    }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    double surfaceGravity() {
        return G * mass / (radius * radius);
    }

    double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }

    public static void main(String[] args) {
        for (Planet p : Planet.values()) {
            double mass = p.mass();
            double radius = p.radius();
            System.out.printf("Your weight on %s is %f%n", p, mass, radius);
        }
    }
}

结果:

Your weight on MERCURY is 330300000000000000000000.000000
Your weight on VENUS is 4869000000000000000000000.000000
Your weight on EARTH is 5976000000000000000000000.000000
Your weight on MARS is 642100000000000000000000.000000
Your weight on JUPITER is 1900000000000000000000000000.000000
Your weight on SATURN is 568800000000000000000000000.000000
Your weight on URANUS is 86860000000000000000000000.000000
Your weight on NEPTUNE is 102400000000000000000000000.000000

1.2 switch

扩大 switch 语句使用范围
5.0 之前,Java 中 switch 的值只能够是简单类型,比如 int、byte、short、char, 有了枚举类型之后,就可以使用对象了。

// 定义一周七天的枚举类型         
    public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun }
    // 读取当天的信息
    WeekDayEnum today = readToday();
// 根据日期来选择进行活动
    switch(today) {
        Mon: do something; break;
        Tue: do something; break;
        Wed: do something; break;
        Thu: do something; break;
        Fri: do something; break;
        Sat: play sports game; break;
        Sun: have a rest; break;
    }

参考:
[ 1 ].https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
[ 2 ].https://www.ibm.com/developerworks/cn/java/j-lo-enum/index.html

### Java 枚举的概念与使用方法 #### 什么是枚举? 在 Java 中,`enum` 是一种特殊的数据类型,用于定义一组固定的常量集合。通过使用 `enum`,可以提高代码的可读性和安全性。 #### 创建和使用枚举 以下是创建和使用枚举的基本方式: ```java public enum Color { RED, GREEN, BLUE; } ``` 上述代码定义一个名为 `Color` 的枚举类,其中包含三个常量:`RED`, `GREEN`, 和 `BLUE`[^1]。 可以通过以下方式访问这些枚举: ```java System.out.println(Color.RED); // 输出: RED ``` #### 单例模式中的应用 Java 枚举天然支持单例设计模式。由于每个枚举常量在整个 JVM 生命周期中仅存在一个实例,因此可以直接利用这一特性实现线程安全的单例模式。 示例如下: ```java public enum SingletonEnum { INSTANCE; public void doSomething() { System.out.println("Singleton doing something..."); } } // 调用单例方法 SingletonEnum.INSTANCE.doSomething(); ``` 此代码展示了如何通过枚举来实现单例模式,并调用其方法。 #### 序列化与反序列化的处理 当枚举被序列化后再进行反序列化时,JVM 确保返回的是原始的枚举实例而非新创建的对象。这进一步增强了枚举作为单例使用的可靠性。 #### 遍历枚举一个枚举都隐含提供了一个静态方法 `values()`,该方法能够返回按声明顺序排列的所有枚举常量组成的数组。配合增强型 for 循环即可轻松遍历所有可能取。 示例代码如下: ```java for (Color color : Color.values()) { System.out.println(color); } ``` 这段程序会依次输出 `RED`, `GREEN`, 和 `BLUE`[^3]。 #### 方法重载于枚举 除了简单的命名外,还可以给枚举添加字段以及构造器,甚至自定义行为逻辑的方法。 例子展示带参数的复杂枚举结构及其操作函数: ```java public enum Planet { MERCURY(3.30E23), VENUS(4.87E24), EARTH(5.98E24); private final double mass; // kilograms Planet(double mass) { this.mass = mass; } public double getMass() { return mass; } } Planet earth = Planet.EARTH; System.out.printf("Earth's mass is %.2f kg%n", earth.getMass()); ``` 这里我们不仅限定了行星名称还附加了质量属性并通过 getter 访问[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值