持续创作,加速成长!这是我参与「掘金日新计划 · 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
关于枚举类的使用比较简单,合理的使用枚举类可以增强代码的可读性,也是项目便于管理,比如需要定义一个常量池来统一使用,也可以避免参数的传递错误。