枚举类的使用

159 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

枚举类

枚举类相当于是一种语法规范,用来表示固定且有限个的对象,比如季节,星期,性别等,当没有枚举类型时我们要实现这样的需求需要满足以下几个条件:
(1)构造器私有化
(2)本类内部创建一组对象
(3)对外暴露对象(同过为对象添加public final static修饰符)
(4)可以提供get方法,但是不要提供set 这样做可以对使用者进行约束和规范。

public class Season {

    private String name;
    private String desc;

    public static final Season SPRING = new Season("春天","温暖");
    public static final Season SUMMER = new Season("夏天","炎热");
    public static final Season AUTOMN = new Season("秋天","凉爽");
    public static final Season WINTER = new Season("冬天","寒冷");

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

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + ''' +
                ", desc='" + desc + ''' +
                '}';
    }

    public static void main(String[] args) {
        System.out.println(Season.AUTOMN);
    }
}

由此可以看出,枚举类和普通类存在一定的区别:

  • 使用 enum 定义的枚举类默认继承 java.lang.Enum 类(可以通过javap命令反编译class文件证明),所以枚举类无法继承别的类了,而普通类的一般父类默认是 Object
  • 枚举类的构造器只能使用 private 定义,防止使用者创建枚举类的实例,使用无参构造器创建枚举对象,则实参列表和小括号都可以省略,而普通类的还可以用 public 修饰,
  • 枚举类的所有实例必须在枚举类中显示列出(用","分隔且以";"结尾),所有枚举值都是用public static final修饰的(会省略)。
  • 所有的枚举类都提供了一个 values() 方法,可以用来遍历枚举值。

enum关键字的使用

定义多个常量对象需要用逗号隔开,定义对象的格式是 常量名(参数列表)

enum Season2 {

    SPRING("春天", "温暖"),
    SUMMER("夏天", "炎热"),
    AUTOMN("秋天", "凉爽"),
    WINTER("冬天", "寒冷") //定义常量
    
    private String name;  //属性
    private String desc;

    Season2(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    
    Season2(){} //无参构造

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() { //重写了toString,不重写则直接返回变量名
        return "Season2{" +
                "name='" + name + ''' +
                ", desc='" + desc + ''' +
                '}';
    }
}
public class TestEnum1 {
    public static void main(String[] args) {
        Gender boy = Gender.BOY;
        Gender boy1 = Gender.BOY;
        System.out.println(boy == boy1);  //ture,变量本身本质是静态的的
        System.out.println(Gender.BOY); //直接输出BOY,调用的是父类Enum的toString方法
    }
}
enum Gender{
    BOY, GIRL;  //调用的是无参构造,如果写了有参构造,则要显示声明无参构造
}

Enum的toString方法是直接返回变量名

enum的常用方法

使用关键字enum时,会隐式继承Enum类,这样我们就可以使用Enum类相关的方法。

public abstract class Enum<E extends Enum<E>> implements Comparable<E>,Serializable {
}
方法名详细描述
valueOf()传递枚举类型的Class对象和枚举常量名称给静态方法valueOf,会得到与参数匹配的枚举常量。
toString()得到当前枚举常量的名称,可以通过重写这个方法来使得到的结果更易读。
equals()在枚举类型中可以直接使用"=="来比较两个枚举常量是否相等。Enum提供的这个equals0方法,也是直接使用"=="实现的。它的存在是为了在Set、List 和Map中使用。注意,equals()是不可变的 。
hashCode()Enum实现了hashCode()来和equals()保持一致。它也是不可变的。
name()得到当前枚举常量的名称。建议优先使用toString()。
ordinal()得到当前枚举常量的次序。
compareTo()枚举类型实现了Comparable接口,这样可以比较两个枚举常量的大小(按照声明的顺序排列) 。
clone()枚举类型不能被Clone。为了防止子类实现克隆方法,Enum 实现了一个仅抛出CloneNotSupportedException异常的不变Clone()。
getDeclaringClass()getDeclaringClassp得到枚举常量所属枚举类型的Class对象。可以用它来判断两个枚举常量是否属于同一个枚举类型。。

enum实现接口

1)使用enum关键字后,就不能再继承其它类了,因为enum会隐式继承Enum而,Java是单继承机制,enum默认实现了java.lang.Comparable接口。

2)枚举类和普通类一样,可以实现接口如下形式。

enum 类名 implements 接口1,接口2

关于枚举类的使用比较简单,合理的使用枚举类可以增强代码的可读性,也是项目便于管理,比如需要定义一个常量池来统一使用,也可以避免参数的传递错误。