枚举类的使用
主要内容
-
如何自定义枚举类
-
如何使用 关键字 enum定义枚举类 -
Enum 类的主要方法 -
实现接口的枚举类
概念:
-
类的对象只有有限个,确定的。如:
- 星期
- 性别
- 季节
-
当需要定义一组常量时,强烈建议使用枚举类 -
若枚举类只有一个对象,则可以作为一种单例模式的实现方式
自定义枚举类
package com.atguigu.java;
/**
* 一、枚举类的使用
* 1.类的对象只有有限个,确定的
* 2.当需要定义一组常量时,强烈建议使用枚举类
* 3.若枚举类只有一个对象,则可以作为一种单例模式的实现方式
*
* 二、如何定义枚举类
*
* 方式一:jdk 5.0之前,自定义枚举类
*
* 方式二:jdk 5.0时,可以使用 enum关键字定义枚举类
*
* @author lv
* @create 2020-12-16 21:16
*/
public class SeasonTest {
public static void main(String[] args) {
Season s1 = Season.SPRING;
System.out.println(s1 + " : " + s1.getSeasonName());
Season w1 = Season.WINTER;
System.out.println(w1 + " : " + w1.getSeasonName());
System.out.println(Season.class.getSuperclass()); // class java.lang.Object
}
}
class Season {
// 1.声明 Season对象的属性:private final修饰
private final String seasonName;
private final String seasonDesc;
// 2.私有化类的构造器,并给对象属性赋值
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 3.提供当前枚举类的多个对象 public static final
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("冬天", "白雪皑皑");
// 4.其它诉求1:获取枚举类对象属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
// 5.其它诉求2:提供 toString()
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
enum 关键字定义枚举类
package com.atguigu.java;
/**
* 使用 enum关键字定义枚举类
* 说明:定义的枚举类 默认继承于 java.lang.Enum 类
*
* @author lv
* @create 2020-12-17 19:34
*/
public class SeasonTest1 {
public static void main(String[] args) {
Season1 a1 = Season1.AUTUMN;
System.out.println(a1); // AUTUMN
System.out.println(a1.toString()); // AUTUMN
System.out.println(a1.getSeasonDesc()); // 789
System.out.println(Season1.class.getSuperclass()); // class java.lang.Enum
}
}
// 使用 enum关键字创建枚举类
enum Season1 {
// 1.提供当前枚举类对象,多个对象之间用 ‘,’ 隔开,结尾使用 ‘;’
SPRING("春天", "123"),
SUMMER("夏天", "456"),
AUTUMN("秋天", "789"),
WINTER("冬天", "741");
// 2.声明 Season1对象的属性 private final
private final String seasonName;
private final String seasonDesc;
// 3.私有化构造器,并赋值
private Season1(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 4.其它诉求:
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
// @Override
// public String toString() {
// return "Season1{" +
// "seasonName='" + seasonName + '\'' +
// ", seasonDesc='" + seasonDesc + '\'' +
// '}';
// }
}
Enum 类
主要方法
-
values()方法:返回枚举类型的对象数组;该方法可以很方便地遍历所有的枚举值
-
valueOf(String str):可以把一个字符串转为对应的枚举类对象;要求字符串必须是枚举类对象的 “名字”;如不是,会有运行时异常:IllegalArgumentException
-
toString():返回当前枚举类对象常量的名称
package com.atguigu.java;
import java.util.Arrays;
/**
* 使用 enum关键字定义枚举类
* 说明:定义的枚举类 默认继承于 java.lang.Enum 类
*
* @author lv
* @create 2020-12-17 19:34
*/
public class SeasonTest1 {
public static void main(String[] args) {
Season1 a1 = Season1.AUTUMN;
// toString()
System.out.println(a1); // AUTUMN
System.out.println(a1.toString()); // AUTUMN
System.out.println(a1.getSeasonDesc()); // 789
System.out.println(Season1.class.getSuperclass()); // class java.lang.Enum
// values()
Season1[] values = Season1.values();
System.out.println(Arrays.toString(values)); // [SPRING, SUMMER, AUTUMN, WINTER]
Thread.State[] values1 = Thread.State.values();
System.out.println(Arrays.toString(values1)); // [NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED]
// valueOf(String name)
Season1 w1 = Season1.valueOf("WINTER");
System.out.println(w1); // WINTER
}
}
// 使用 enum关键字创建枚举类
enum Season1 {
// 1.提供当前枚举类对象,多个对象之间用 ‘,’ 隔开,结尾使用 ‘;’
SPRING("春天", "123"),
SUMMER("夏天", "456"),
AUTUMN("秋天", "789"),
WINTER("冬天", "741");
// 2.声明 Season1对象的属性 private final
private final String seasonName;
private final String seasonDesc;
// 3.私有化构造器,并赋值
private Season1(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 4.其它诉求:
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
// @Override
// public String toString() {
// return "Season1{" +
// "seasonName='" + seasonName + '\'' +
// ", seasonDesc='" + seasonDesc + '\'' +
// '}';
// }
}
使用 enum关键字定义的枚举类 实现接口的情况
package com.atguigu.java;
import java.util.Arrays;
/**
* 使用 enum关键字定义枚举类
* 说明:定义的枚举类 默认继承于 java.lang.Enum 类
*
* @author lv
* @create 2020-12-17 19:34
*/
public class SeasonTest1 {
public static void main(String[] args) {
Season1 a1 = Season1.AUTUMN;
// toString()
System.out.println(a1); // AUTUMN
System.out.println(a1.toString()); // AUTUMN
System.out.println(a1.getSeasonDesc()); // 789
System.out.println(Season1.class.getSuperclass()); // class java.lang.Enum
// values()
Season1[] values = Season1.values();
System.out.println(Arrays.toString(values)); // [SPRING, SUMMER, AUTUMN, WINTER]
for (int i = 0; i < values.length; i++) {
// System.out.println(values[i].show();); err
// values[i].show();
// enum类,在switch中的使用
switch(values[i]) {
case SPRING:
values[i].show();
break;
case SUMMER:
values[i].show();
break;
case AUTUMN:
values[i].show();
break;
case WINTER:
values[i].show();
break;
}
}
Thread.State[] values1 = Thread.State.values();
System.out.println(Arrays.toString(values1)); // [NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED]
// valueOf(String name)
Season1 w1 = Season1.valueOf("WINTER");
System.out.println(w1); // WINTER
// 情况一、在 enum类中实现抽象方法
// w1.show(); // this is a season!
// 情况二、分别实现抽象方法
w1.show(); // 大约在冬季
}
}
interface Info {
public abstract void show();
}
// 使用 enum关键字创建枚举类
enum Season1 implements Info {
// 1.提供当前枚举类对象,多个对象之间用 ‘,’ 隔开,结尾使用 ‘;’
SPRING("春天", "123") {
@Override
public void show() {
System.out.println("春天在哪里?");
}
},
SUMMER("夏天", "456") {
@Override
public void show() {
System.out.println("宁夏");
}
},
AUTUMN("秋天", "789") {
@Override
public void show() {
System.out.println("秋天不回来");
}
},
WINTER("冬天", "741") {
@Override
public void show() {
System.out.println("大约在冬季");
}
};
// 2.声明 Season1对象的属性 private final
private final String seasonName;
private final String seasonDesc;
// 3.私有化构造器,并赋值
private Season1(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 4.其它诉求:
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
// @Override
// public String toString() {
// return "Season1{" +
// "seasonName='" + seasonName + '\'' +
// ", seasonDesc='" + seasonDesc + '\'' +
// '}';
// }
// @Override
// public void show() {
// System.out.println("this is a season!");
// }
}