0️⃣前言
枚举类的实现
📍JDK1.5之前需要自定义枚举类
📍JDK1.5新增的enum关键字用于定义枚举类
若枚举类只有一个对象,则可以用来作为一种单例模式的实现方式
当需要定义一组常量时,强烈推荐使用枚举类
枚举类的属性
📍枚举类对象的属性不允许被改动,所以应该使用private final修饰
📍枚举类的使用private final修饰的属性应该在构造器中为其赋值
📍若枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数
1️⃣自定义枚举类
需要注意的地方:
①类内的属性应该是private final一旦确定,不可修改
②枚举值(对象)应该是static final,不允许修改,只能通过类来进行调用
/**
* @Author: ssy
* @Description:
* @Date: Created in 9:49 2020/11/27
* @Modified By:
*/
public class enumTest1 {
public static void main(String[] args) {
Season spring = Season.SPRING;
Season summer = Season.SUMMER;
System.out.println(spring);
System.out.println(summer);
}
}
class Season{
private final String seasonName;
private final String seasonDesc;
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public static final Season SPRING=new Season("春天","四季如春");
public static final Season SUMMER=new Season("夏天","夏日炎炎");
public static final Season AUTUMN=new Season("秋天","秋高气爽");
public static final Season WINTER=new Season("冬天","冰天雪地");
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
2️⃣enum关键字枚举类
需要注意的地方
①enum是一个关键字,用于代替class创建枚举类,此时创建的枚举类的父类不再是Object,而是class java.lang.Enum类,所以在不重写toString()的情况下,输出的不是地址值,而是枚举对象的名称
②使用enum的枚举类,必须先写枚举对象,直接写名称,如果有成员变量需要通过构造器的方式进行初始化,再在枚举对象名称的后面添加一个括号,传值构造器
③其他与自定义的枚举类相同
/**
* @Author: ssy
* @Description:
* @Date: Created in 9:59 2020/11/27
* @Modified By:
*/
public class enumTest2 {
public static void main(String[] args) {
Season1 spring= Season1.SPRING;
System.out.println(spring); //SPRING
System.out.println(Season1.class.getSuperclass()); //class java.lang.Enum
}
}
enum Season1{
//提供当前类的枚举对象,多个对象之间使用逗号隔开,末尾使用分号结束
//如果没有变量需要通过构造器初始化,则只写枚举对象的名称即可
SPRING("春天","四季如春"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","冰天雪地");
private final String seasonName;
private final String seansonDesc;
Season1(String seasonName, String seansonDesc) {
this.seasonName = seasonName;
this.seansonDesc = seansonDesc;
}
}
Enum类的主要方法
values():返回枚举类型的对象数组,该方法可以方便地遍历所有的枚举值
valueOf(String str):可以把一个字符串转换为对应的枚举类对象。要求字符串必须是枚举类对象的”名字“,如果不是,会有运行时异常
toString():返回当前枚举类对象常量的名称
//仍以上面的Season1为例
@Test
public void test1(){
Season1[] season1s=Season1.values();
System.out.println(Arrays.toString(season1s));
try {
Season1 winter = Season1.valueOf("WINTER");
System.out.println(winter);
Season1 autumn = Season1.valueOf("autumn");
System.out.println(autumn);
}
catch (RuntimeException e){
System.out.println("没有当前枚举类对象");
}
}
使用enum的枚举类如何实现接口
🅰如果所有枚举对象对需要重写的方法的要求一致,则按照以前常规写法即可
🅱如果每个枚举对象有自己独特的方法要求,则需要在每个对象的构造器之后进行重写,如下
import org.junit.Test;
/**
* @Author: ssy
* @Description:
* @Date: Created in 9:59 2020/11/27
* @Modified By:
*/
public class enumTest2 {
@Test
public void test2(){
Season1 summer = Season1.SUMMER;
summer.show();
}
}
interface Travel{
void show();
}
enum Season1 implements Travel {
//提供当前类的枚举对象,多个对象之间使用逗号隔开,末尾使用分号结束
//如果没有变量需要通过构造器初始化,则只写枚举对象的名称即可
SPRING("春天","四季如春"){
@Override
public void show() {
System.out.println("春天,春困");
}
},
SUMMER("夏天","夏日炎炎"){
@Override
public void show() {
System.out.println("夏天,夏打盹");
}
},
AUTUMN("秋天","秋高气爽"){
@Override
public void show() {
System.out.println("秋天,秋乏");
}
},
WINTER("冬天","冰天雪地"){
@Override
public void show() {
System.out.println("冬天,冬眠");
}
};
private final String seasonName;
private final String seasonDesc;
Season1(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
}