java枚举enum

文章详细介绍了Java中的枚举类型enum的使用,包括枚举的概念、声明枚举、枚举类、为枚举添加方法以及EnumMap和EnumSet的使用。枚举用于定义一组固定的常量,可以更安全地替代常量。文章还展示了如何通过EnumMap进行高效的枚举类型到值的映射,以及使用EnumSet创建高性能的枚举集合。

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

一、概念

枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。
在 JDK 1.5 之前没有枚举类型,那时候一般用接口常量来替代。而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。

二、声明枚举

提示:如果没有显式地声明基础类型的枚举,那么意味着它所对应的基础类型是 int。

下面代码定义了一个表示性别的枚举类型 SexEnum 和一个表示颜色的枚举类型 Color。

public enum SexEnum {
    male,female;
}
public enum Color {
    RED,BLUE,GREEN,BLACK;
}

之后便可以通过枚举类型名直接引用常量,如 SexEnum.male、Color.RED。

三、枚举类

Java 中的每一个枚举都继承自 java.lang.Enum 类。当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。
所有枚举实例都可以调用 Enum 类的方法,常用方法如表:

方法名称描述
values()以数组形式返回枚举类型的所有成员
valueOf()将普通字符串转换为枚举实例
compareTo()比较两个枚举成员在定义时的顺序
ordinal()获取枚举成员的索引位置
public class Main {
    public static void main(String[] args) {
    	//遍历枚举类中的所有成员
        for (int i = 0; i < demo1.values().length; i++) {
            System.out.println(demo1.values()[i]);
        }
        //获取枚举成员
        System.out.println(demo1.valueOf("WANGWU"));
        //比较两个枚举成员
        System.out.println(WANGWU.compareTo(LISI));
        //获取枚举成员的索引值
        System.out.println(WANGWU.ordinal());
    }
}
public enum demo1 {
    ZHANGSNA,
    LISI,
    WANGWU
}

在这里插入图片描述

四、为枚举添加方法

Java 为枚举类型提供了一些内置的方法,同时枚举常量也可以有自己的方法。此时要注意必须在枚举实例的最后一个成员后添加分号,而且必须先定义枚举实例。
每个枚举常量可以运行是会调用构造函数把自己值传给构造函数然后给day赋值,当然也可以调用枚举类中定义的方法。

public class Main {
    public static void main(String[] args) {
        for (WeekDay day:WeekDay.values()) {
            System.out.println(day+":"+day.getDay());
        }
        WeekDay.printDay(1);
    }
}
public enum WeekDay {
    Mon("Monday"),Tue("Tuesday"),Wed("Wednesday"),Thu("Thursday"),Fri("Friday"),Sat("Saturday"),Sun("Sunday");
    private final String day;
    // 以上是枚举的成员,必须先定义,而且使用分号结束
    private WeekDay(String day) {
        this.day = day;
    }
    public static void printDay(int i ){
        switch (i){
            case 1:
                System.out.println(WeekDay.Mon);
                break;
            case 2:
                System.out.println(WeekDay.Tue);
                break;
            case 3:
                System.out.println(WeekDay.Wed);
                break;
            case 4:
                System.out.println(WeekDay.Thu);
                break;
            case 5:
                System.out.println(WeekDay.Fri);
                break;
            case 6:
                System.out.println(WeekDay.Sat);
                break;
            case 7:
                System.out.println(WeekDay.Sun);
                break;
        }
    }
    public String getDay(){
        return day;
    }

在这里插入图片描述
Java 中的 enum 还可以跟 Class 类一样覆盖基类的方法。下面示例代码创建的 Color 枚举类型覆盖了 toString() 方法。

public class Test {
    public enum Color {
        RED("红色",1),GREEN("绿色",2),WHITE("白色",3),YELLOW("黄色",4);
        // 成员变量
        private String name;
        private int index;
        // 构造方法
        private Color(String name,int index) {
            this.name = name;
            this.index = index;
        }
        // 覆盖方法
        @Override
        public String toString() {
            return this.index + "-" + this.name;
        }
    }
    public static void main(String[] args) {
        System.out.println(Color.RED.toString());    // 输出:1-红色
    }
}

五、EnumMap 与 EnumSet

EnumMap 类
EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其他的 Map(如 HashMap)实现也能完成枚举类型实例到值的映射,但是使用 EnumMap 会更加高效。

public class Main {
	// 某类中定义的获取数据库URL的方法以及EnumMap的声明
    private static EnumMap<DataBaseType,String> urls = new EnumMap<DataBaseType,String>(DataBaseType.class);

    public static void main(String[] args) {
        DataBaseInfo();
        String url = getURL(DataBaseType.DB2);
        System.out.println(url);
    }
    public static void DataBaseInfo() {
        urls.put(DataBaseType.DB2,"jdbc:db2://localhost:5000/sample");
        urls.put(DataBaseType.MYSQL,"jdbc:mysql://localhost/mydb");
        urls.put(DataBaseType.ORACLE,"jdbc:oracle:thin:@localhost:1521:sample");
        urls.put(DataBaseType.SQLSERVER,"jdbc:microsoft:sqlserver://sql:1433;Database=mydb");
    }
    //根据不同的数据库类型,返回对应的URL
	// @param type DataBaseType 枚举类新实例
	// @return
    public static String getURL(DataBaseType type) {
        return urls.get(type);
    }
}
// 定义数据库类型枚举
enum DataBaseType {
    MYSQL,ORACLE,DB2,SQLSERVER
}

从本例中可以看出,使用 EnumMap 可以很方便地为枚举类型在不同的环境中绑定到不同的值上。本例子中 getURL 绑定到 URL 上,在其他的代码中可能又被绑定到数据库驱动上去。


EnumSet 类
EnumSet 是枚举类型的高性能 Set 实现,它要求放入它的枚举常量必须属于同一枚举类型。EnumSet 提供了许多工厂方法以便于初始化
在这里插入图片描述
EnumSet 作为 Set 接口实现,它支持对包含的枚举常量的遍历。

for(Operation op:EnumSet.range(Operation.PLUS,Operation.MULTIPLY)) {
    doSomeThing(op);
}

注:本文出自http://c.biancheng.net/view/1100.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝朽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值