java基础-枚举类与注解-枚举类

本文介绍了Java枚举类的基本概念,包括如何自定义枚举类和使用enum关键字定义枚举类的方法。此外还讲解了枚举类的主要方法,以及如何让枚举类实现接口。

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

Java基础之枚举类与注解-枚举类

思考:

  1. 如何自定义枚举类
  2. 如何使用关键字enum定义枚举类
  3. Enum类的主要方法
  4. 实现接口的枚举类

什么是枚举类?

  • 类的对象只有有限个并且是确定的
  • 当需要定义一组常量时,强烈建议使用枚举类

如何定义枚举类?

  • 在jdk5.0之前,自定义枚举类
  • jdk5.0及以后,使用enum关键字定义枚举类
  1. 自定义枚举类

    a. 声明MyEnum对象的属性:将属性声明成private final修饰

//1.声明MyEnum对象的属性:将属性声明成private final修饰
private final String name;
private final String desc;

​ b.私有化构造方法,并且给private final的属性赋值

private MyEnum(String name,String desc){
    this.name = name;
    this.desc = desc;
}

​ c. 提供当前枚举类的多个对象

public static final MyEnum TYPE1 = new MyEnum("myEnum1","desc1");
public static final MyEnum TYPE2 = new MyEnum("myEnum2","desc2");
public static final MyEnum TYPE3 = new MyEnum("myEnum3","desc3");
public static final MyEnum TYPE4 = new MyEnum("myEnum4","desc3");
/**
 * 一、枚举类的使用
 * 1.枚举类的理解:类的对象只有有限个并且是确定的,则可以使用枚举类
 * 2.当需要定义一组常量时,强烈建议使用枚举类
 * 3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式。
 *
 * 二、如何定义枚举类
 * 1.在JDK5.0之前,自定义枚举类
 * 2.在JDK5.0及以后,使用enum关键字定义枚举类
 *
 * @author jiangl
 * @version 1.0
 * @date 2021/4/21 8:44
 */
public class EnumTest {
    public static void main(String[] args) {
        System.out.println(MyEnum.TYPE1.getName());
    }
}
//自定义枚举类
class MyEnum{
    //1.声明MyEnum对象的属性:将属性声明成private final修饰
    private final String name;
    private final String desc;

    /**
     * 2.私有化构造方法,并且给private final的属性赋值
     */
    private MyEnum(String name,String desc){
        this.name = name;
        this.desc = desc;
    }

    /**
     * 3.提供当前枚举类的多个对象
     */
    public static final MyEnum TYPE1 = new MyEnum("myEnum1","desc1");
    public static final MyEnum TYPE2 = new MyEnum("myEnum2","desc2");
    public static final MyEnum TYPE3 = new MyEnum("myEnum3","desc3");
    public static final MyEnum TYPE4 = new MyEnum("myEnum4","desc3");

    /**
     * 4.其他需求,获取枚举类对象的属性
     * @return
     */
    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }
}
  1. 使用enum关键字定义枚举类(默认继承于java.lang.Enum)
  • 提供当前枚举类的对象

    • 多个对象之间用“,"隔开
    • 末尾对象用";"结束
    /**
     * 1.提供当前枚举类的对象,多个对象之间用“,"隔开,末尾对象用";"结束
     */
    TYPE1("myEnum1","desc1"),
    TYPE2("myEnum2","desc2"),
    TYPE3("myEnum3","desc3"),
    TYPE4("myEnum4","desc3");
    
  • enum MyEnum枚举类的父类为java.lang.Enum

/**
 * 在JDK5.0及以后,使用enum关键字定义枚举类
 * @author jiangl
 * @version 1.0
 * @date 2021/4/21 8:44
 */
public class EnumTest1 {
    public static void main(String[] args) {
        System.out.println(MyEnum1.TYPE1.getName());
        System.out.println(MyEnum1.class.getSuperclass());
    }
}

//使用enum关键字枚举类
enum MyEnum1{

    /**
     * 1.提供当前枚举类的对象,多个对象之间用“,"隔开,末尾对象用";"结束
     */
    TYPE1("myEnum1","desc1"),
    TYPE2("myEnum2","desc2"),
    TYPE3("myEnum3","desc3"),
    TYPE4("myEnum4","desc3");

    //2.声明MyEnum对象的属性:将属性声明成private final修饰
    private final String name;
    private final String desc;

    /**
     * 3.私有化构造方法,并且给private final的属性赋值
     */
    private MyEnum1(String name,String desc){
        this.name = name;
        this.desc = desc;
    }

    /**
     * 4.其他诉求,获取枚举类对象的属性
     * @return
     */
    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }
}
  1. Enum类中的常用方法:
  • 父类中提供的方法
方法名详细描述
valueof传递枚举类型的Class对象和枚举常量名称给静态方法valueOf,会得到与参数匹配的枚举常量
toString得到当前枚举常量的名称。可以通过重写这方法来使得得到的结果更易懂
equals在枚举类型中可以直接使用"“来比较两个枚举常量是否相等。Enum提供的这个equals()方法,也是直接使用”"实现的。它的存在是为了在Set、List和Map中使用。注意,equals()是不可变的(被final修饰),即枚举类不能重写equals方法。
hashCodeEnum实现了hashCode()来和equals()保持一致。hashCode()方法也是不可变的(被final修饰),即枚举类不能重写hashCode()方法
getDeclaringClass得到枚举常量所属枚举类型的Class对象。可以用此方法判断两个枚举常量是否属于同一个枚举类型
name得到当前枚举常量的名称。建议优先使用toString()方法
ordinal得到当前枚举常量的次序
compareTo枚举类型实现了Comparable接口,这样可以比较两个枚举常量的大小(按照声明的顺序排列)
clone枚举类型不能被Clone。为了防止子类实现克隆方法,Enum实现了一个仅抛出了CloneNotSupportedException异常的不变clone()方法,即枚举类不能重写clone()方法
  • 主要方法:
    • values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值,可用于自定义根据key获取响应枚举值
    • valueOf(String str): 根据一个字符串转换为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”(枚举类对象常量名)。如不是,会有运行时异常:IllegalArgumentException
    • toString(): 返回当前枚举类对象常量的名称
/**
 * 在JDK5.0及以后,使用enum关键字定义枚举类
 * @author jiangl
 * @version 1.0
 * @date 2021/4/21 8:44
 */
public class EnumTest1 {
    public static void main(String[] args) {
        //toString(): 返回当前枚举类对象常量的名称
        System.out.println(MyEnum1.TYPE1.toString());
        //等同于MyEnum1.TYPE1 valueOf(String str): 根据一个字符串转换为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”(枚举类对象常量名)。如不是,会有运行时异常:IllegalArgumentException
        System.out.println(MyEnum1.valueOf("TYPE1"));
        
        //values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值,可用于自定义根据key获取响应枚举值
        MyEnum1[] values = MyEnum1.values();
        for(int i=0;i<=values.length-1;i++){
            System.out.println(values[i]);
        }
    }
}

//使用enum关键字枚举类
enum MyEnum1{

    /**
     * 1.提供当前枚举类的对象,多个对象之间用“,"隔开,末尾对象用";"结束
     */
    TYPE1("myEnum1","desc1"),
    TYPE2("myEnum2","desc2"),
    TYPE3("myEnum3","desc3"),
    TYPE4("myEnum4","desc3");

    //2.声明MyEnum对象的属性:将属性声明成private final修饰
    private final String name;
    private final String desc;

    /**
     * 3.私有化构造方法,并且给private final的属性赋值
     */
    private MyEnum1(String name,String desc){
        this.name = name;
        this.desc = desc;
    }

    /**
     * 4.其他诉求,获取枚举类对象的属性
     * @return
     */
    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "MyEnum1{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}
  1. 使用自定义枚举类和enum枚举类实现接口

    1. 实现接口,在enum类中实现抽象方法

      interface MyInfo{
          void read();
      }
      
      //使用enum关键字枚举类
      enum MyEnum1 implements MyInfo{
      
          /**
           * 1.提供当前枚举类的对象,多个对象之间用“,"隔开,末尾对象用";"结束
           */
          TYPE1("myEnum1","desc1"),
          TYPE2("myEnum2","desc2"),
          TYPE3("myEnum3","desc3"),
          TYPE4("myEnum4","desc3");
      
          ....
      
          @Override
          public void read() {
              System.out.println("重写了read");
          }
      }
      
    2. 针对每个枚举类对象分别实现抽象方法

      interface MyInfo{
          void read();
      }
      
      //使用enum关键字枚举类
      enum MyEnum1 implements MyInfo{
      
          /**
           * 1.提供当前枚举类的对象,多个对象之间用“,"隔开,末尾对象用";"结束
           */
          TYPE1("myEnum1","desc1"){
              @Override
              public void read() {
                  System.out.println("myEnum1-read");
              }
          },
          TYPE2("myEnum2","desc2"){
              @Override
              public void read() {
                  System.out.println("myEnum2-read");
              }
          },
          TYPE3("myEnum3","desc3"){
              @Override
              public void read() {
                  System.out.println("myEnum3-read");
              }
          },
          TYPE4("myEnum4","desc3"){
              @Override
              public void read() {
                  System.out.println("myEnum4-read");
              }
          };
      
          //2.声明MyEnum对象的属性:将属性声明成private final修饰
          private final String name;
          private final String desc;
      
          /**
           * 3.私有化构造方法,并且给private final的属性赋值
           */
          private MyEnum1(String name,String desc){
              this.name = name;
              this.desc = desc;
          }
      
          /**
           * 4.其他诉求,获取枚举类对象的属性
           * @return
           */
          public String getName() {
              return name;
          }
      
          public String getDesc() {
              return desc;
          }
      
          @Override
          public String toString() {
              return "MyEnum1{" +
                      "name='" + name + '\'' +
                      ", desc='" + desc + '\'' +
                      '}';
          }
      
      }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值