枚举类【Java】
跟往常一样,先亮源码:
Gitee https://gitee.com/drip123456/java-se
GIthub https://github.com/Drip123456/JavaSE
枚举类
假设现在我们想给小明添加一个状态(跑步、学习、睡觉),外部可以实时获取小明的状态:
public class Student extends Person implements Study {
private String status; //状态,可以是跑步、学习、睡觉这三个之中的其中一种
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
但是这样会出现一个问题,如果我们仅仅是存储字符串,似乎外部可以不按照我们规则,传入一些其他的字符串。这显然是不够严谨的,有没有一种办法,能够更好地去实现这样的状态标记呢?我们希望开发者拿到使用的就是我们预先定义好的状态,所以,我们可以使用枚举类来完成:
public enum Status { //enum表示这是一个枚举类,枚举类的语法稍微有一些不一样
RUNNING, STUDY, SLEEP; //直接写每个状态的名字即可,最后面分号可以不打,但是推荐打上
}
使用枚举类也非常方便,就像使用普通类型那样:
private Status status; //类型变成刚刚定义的枚举类
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
这样,别人在使用时,就能很清楚地知道我们支持哪些了:
枚举类型使用起来就非常方便了,其实枚举类型的本质就是一个普通的类,但是它继承自Enum
类,我们定义的每一个状态其实就是一个public static final
的Status类型成员变量:
//这里使用javap命令对class文件进行反编译得到 Compiled from "Status.java"
public final class com.test.Status extends java.lang.Enum<com.test.Status> {
public static final com.test.Status RUNNING;
public static final com.test.Status STUDY;
public static final com.test.Status SLEEP;
public static com.test.Status[] values();
public static com.test.Status valueOf(java.lang.String);
static {};
}
既然枚举类型是普通的类,那么我们也可以给枚举类型添加独有的成员方法:
public enum Status {
RUNNING("睡觉"), STUDY("学习"), SLEEP("睡觉"); //无参构造方法被覆盖,创建枚举需要添加参数(本质就是调用的构造方法)
private final String name; //枚举的成员变量
Status(String name){ //覆盖原有构造方法(默认private,只能内部使用!)
this.name = name;
}
public String getName() { //获取封装的成员变量
return name;
}
}
这样,枚举就可以按照我们想要的中文名称打印了:
public static void main(String[] args) {
Student student = new Student("小明", 18, "男");
student.setStatus(Status.RUNNING);
System.out.println(student.getStatus().getName());
}
枚举类还自带一些继承下来的实用方法,比如获取枚举类中的所有枚举,只不过这里用到了数组,我们会在下一章进行介绍。
至此,面向对象基础内容就全部讲解完成了,下一章我们还将继续讲解面向对象的其他内容。