Java枚举类

概念

枚举类,顾名思义即类的对象只有确定的有限个。比如:

  • 星期:周一、 ...  、周日

  • 性别:男、女

  • 季节:春、夏、秋、冬

  • 线程状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMEED_WAITING、TERMINATED

枚举类的实现

  •     jdk1.5之前需要自定义枚举类

  •     jdk1.5新增的enum关键字用于定义枚举类

枚举类的属性

  • 枚举类的属性应不允许被改动,所以应使用private final修饰

  • 枚举类的使用private final 修饰的属性应在构造方法中进行赋值

  • 若枚举类显式的定义了带参数的构造方法,则在列出枚举值时也必须传入对应的参数

自定义枚举类


/**
 * 自定义枚举类
 */
class DateType {
    //1、声明自定义枚举类对象的属性,要用private final修饰
    private final String date;
    private final String description;

    //2、私有化构造方法,并给属性赋值
    private DateType(String date, String description) {
        this.date = date;
        this.description = description;
    }

    //3、提供当前枚举类 用static final修饰(可通过类名直接调用且不可变)
    public static final DateType YESTERDAY = new DateType("昨天", "悟已往之不谏");
    public static final DateType TODAY = new DateType("今天", "珍惜当下");
    public static final DateType TOMORROW = new DateType("明天", "知来者之可追");

    //4、其他诉求:比如get()方法、toString()方法
    public String getDate() {
        return date;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return "DateType{" +
                "date='" + date + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

测试代码


public class EnumTest {
    public static void main(String[] args) {
        DateType yesterday = DateType.YESTERDAY;
        DateType today = DateType.TODAY;
        DateType tomorrow = DateType.TOMORROW;
        System.out.println(yesterday);
        System.out.println(today);
        System.out.println(tomorrow);
   }
}

控制台输出

DateType{date='昨天', description='悟已往之不谏'}DateType{date='今天', description='珍惜当下'}DateType{date='明天', description='知来者之可追'}

使用enum关键字定义枚举类

/**
 * 使用enum关键字定义枚举类
 */
enum DateType1 {
    //1、提供当前枚举类对象,多个对象之间用,隔开 末尾的对象以分号结束
    YESTERDAY("昨天", "悟已往之不谏"),
    TODAY("今天", "珍惜当下"),
    TOMORROW("明天", "知来者之可追");

    //2、声明自定义枚举类对象的属性,要用private final修饰
    private final String date;
    private final String description;

    //3、私有化构造方法,并给属性赋值
    private DateType1(String date, String description) {
        this.date = date;
        this.description = description;
    }

    //4、其他诉求:比如get()方法、toString()方法
    public String getDate() {
        return date;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return "DateType1{" +
                "date='" + date + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

        对比两种实现方式,都需要提供属性(如果有)和私有构造方法。使用enum关键字实现时,非常简洁。

Enum类的常用方法

  1. values()方法:返回枚举类的对象数组,该方法可以很方便地遍历所有的枚举值

  2. valueOf(String str):如果传入的字符串和枚举类的名称匹配,那么将该字符串转变为对应的枚举类对象。如果不匹配,则抛出 IllegalArgumentException 异常

  3. toString:返回当前枚举类对象常量的名称

测试代码


public class EnumTest {
    public static void main(String[] args) {
        //Enum类的values方法
        DateType1[] dateType1s = DateType1.values();
        for(DateType1 dateType1 : dateType1s) {
            System.out.println(dateType1);
        }
        //valueOf方法
        System.out.println("找到了枚举类:" + DateType1.valueOf("TODAY"));
        System.out.println("找到了枚举类:"  + DateType1.valueOf("TODAY1"));
    }
}

控制台输出

YESTERDAYTODAYTOMORROW找到了枚举类:TODAYException in thread "main" java.lang.IllegalArgumentException: No enum constant com.canon.enumeration.DateType1.TODAY1  at java.base/java.lang.Enum.valueOf(Enum.java:240)  at com.canon.enumeration.DateType1.valueOf(EnumTest.java:66)  at com.canon.enumeration.EnumTest.main(EnumTest.java:20)

使用enum关键字定义的枚举类实现接口的方式

  • 情况一:实现接口,在enum类中实现抽象方法(就和普通的类实现接口一样)

  • 情况二:让枚举类的对象分别实现接口中的抽象方法

interface Info {
    void show();
}
/**
 * 使用enum关键字定义枚举类
 */
enum DateType1 implements Info{
    //1、提供当前枚举类对象,多个对象之间用,隔开 末尾的对象以分号结束
    YESTERDAY("昨天", "悟已往之不谏") {
        @Override
        public void show() {
            System.out.println("认识到过去的错误已经不可挽回");
        }
    },
    TODAY("今天", "珍惜当下") {
        @Override
        public void show() {
            System.out.println("珍惜时间,珍惜眼前人");
        }
    },
    TOMORROW("明天", "知来者之可追") {
        @Override
        public void show() {
            System.out.println("知道未来的事还来得及补救");
        }
    };

    //2、声明自定义枚举类对象的属性,要用private final修饰
    private final String date;
    private final String description;

    //3、私有化构造方法,并给属性赋值
    private DateType1(String date, String description) {
        this.date = date;
        this.description = description;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值