枚举类
枚举是一种特殊的类(编译之后也是生成class文件)
可以实现接口,属于引用数据类型,枚举类是一组常量(枚举对象)的集合
可以将枚举对象当作常量使用
自定义枚举类
自定义一个类实现枚举的效果
-
构造器私有化
: 因为枚举对象的个数是固定的,所以需要防止直接new对象 -
创建一组固定的枚举对象
: 在类的内部直接创建枚举对象并使用常量接收,常量名通常全部大写并且使用final修饰(防止类加载)
-
去掉属性的setXxx方法
: 防止枚举对象的属性被修改
java">public class Enumeration02 {
public static void main(String[] args) {
System.out.println(Season.AUTUMN);
System.out.println(Season.SPRING);
}
}
class Season {
private String name;
private String desc;
// 定义了固定的四个季节对象
public static final Season SPRING = new Season("春天", "温暖");
public static final Season WINTER = new Season("冬天", "寒冷");
public static final Season AUTUMN = new Season("秋天", "凉爽");
public static final Season SUMMER = new Season("夏天", "炎热");
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
enum关键字
枚举类型的定义: 使用enum
关键字替代class创建类, 此时创建的枚举类是final修饰的并且默认继承Enum类
即此时不能再继承其它类了
java">enum 枚举类型名 implements 接口 1,接口 2{
// 枚举对象
枚举对象(构造方法的实参列表)....;
// 枚举类也可以有属性和构造方法
}
java">public class Enumeration03 {
public static void main(String[] args) {
System.out.println(Season2.AUTUMN);
System.out.println(Season2.SUMMER);
}
}
// 枚举类
enum Season2 {
// SPRING("春天", "温暖") 本质上还是public static final Season SPRING = new Season("春天", "温暖")
SPRING("春天", "温暖"), WINTER("冬天", "寒冷"), AUTUMN("秋天", "凉爽"),
SUMMER("夏天", "炎热");
// 属性
private String name;
private String desc;
// 无参构造器
private Season2() {
}
private Season2(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
Enum_102">Enum类常用方法
方法名 | 功能 |
---|---|
toString() | Enum类重写后的toString方法可以得到枚举对象的名称 我们自己也可以重写toString方法返回枚举对象的属性信息 |
name() | 返回枚举对象的名字 |
ordinal() | 返回该枚举对象在枚举类中的次序,从0开始编号 |
static values() | 以数组的形式返回枚举类中所有的枚举对象 |
static valueOf(枚举字符串) | 根据字符串获取枚举类中对应的枚举对象,如果枚举对象不存在则报异常 |
compareTo(枚举对象) | 比较两个枚举常量的编号,返回前面的减后面的差值 |
compareTo方法和toString方法
源码分析
java">public final int compareTo(E o) {
//...
return self.ordinal - other.ordinal;
}
public String toString() {
// 这个name是枚举对象的名称
return name;
}
java">public class EnumMethod {
public static void main(String[] args) {
// 测试枚举对象的各种方法
Season2 autumn = Season2.AUTUMN;
// 测试name
System.out.println(autumn.name());
// 测试ordinal
System.out.println(autumn.ordinal());
// 测试values
Season2[] values = Season2.values();
System.out.println("===遍历取出枚举对象(增强for)====");
for (Season2 season: values) {
System.out.println(season);
}
// 测试valueOf,根据字符串"AUTUMN"查找Season2枚举类对应的枚举对象
Season2 autumn1 = Season2.valueOf("AUTUMN");
System.out.println("autumn1=" + autumn1);
System.out.println(autumn == autumn1);
// 测试compareTo,比较两个枚举常量
System.out.println(Season2.AUTUMN.compareTo(Season2.SUMMER));
}
枚举类的应用
当方法的返回结果
只有两种情况的时候使用布尔类型,只有当方法的结果超过两种情况并且每一种情况都是一枚一枚可以列举出来的时候推荐使用枚举类
java">public class EnumExercise02 {
public static void main(String[] args) {
// 获取到所有的枚举对象即数组
Week[] weeks = Week.values();
// 遍历
System.out.println("===所有星期的信息如下===");
for (Week week : weeks) {
System.out.println(week);
}
}
}
enum Week {
// 定义Week的枚举对象
MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"), THURSDAY("星期四"),
FRIDAY("星期五"), SATURDAY("星期六"), SUNDAY("星期日");
private String name;
private Week(String name) {
this.name = name;
}
// 重写toString方法用来返回枚举对象的属性信息
@Override
public String toString() {
// 这个name是枚举对象的属性信息
return name;
}
}
使用枚举类型来表示方法的多个返回结果
,如果返回结果只有两种类型最好使用布尔类型(true和false正好可以表示两种不同的状态)
java">//自定义枚举类且没有属性
enum Result{
SUCCESS, FAIL
}
public class EnumTest02 {
public static void main(String[] args) {
Result r = divide(10, 2);
System.out.println(r == Result.SUCCESS ? "计算成功" : "计算失败");
}
// 计算两个int类型数据的商,返回结果是枚举类型
public static Result divide(int a, int b){
try {
// 有可能发生java.lang.ArithmeticException
int c = a / b;
return Result.SUCCESS;
} catch (Exception e){
return Result.FAIL;
}
}
// 使用布尔类型表示方法的返回结果
public static boolean divide(int a, int b){
try {
int c = a / b;
return true;
} catch (Exception e){
return false;
}
}
//规定计算成功返回1,计算失败返回0
public static int divide(int a, int b){
try {
int c = a / b;
return 1;
} catch (Exception e){
return 0;
}
}
}