本不打算写枚举的,但最近在review同事的代码时,发现大家对枚举类型的使用不是很到位,当问他们枚举类型相关概念时,他们都不是很清楚,回答的是:用到的时候再去网上查一下。个人觉得,搞开发要有一个基础知识体系,这些知识要信手拈来。说实话,枚举类型用的不是很多,但是只要用到枚举的地方,必能提高代码的可读性。希望这篇博客能帮助基础薄弱的同学。 示例的源码可以直接通过csdn下载,也可以通过git导出:https://github.com/igdnss/java_enum.git
定义
所谓的枚举就是一一列举出来的意思,那么枚举类型就是一个能将使用到的常量一一列举出来的类型,它是一个特殊的数据类型,能够为一个变量定义一组预定义的常量,例如“周几”这个变量,我们可以为其预定义一组常量,从周一到周日并放入到一个类中,那么这个类就叫着“周几”的枚举类,也就是说将所有可能的值都列举出来再用一个类进行封装。由于枚举类型属于java类中的一种,因此它也可以拥有成员变量和方法。
结构
正常的类定义时使用class关键字,而枚举类型使用enum,包括枚举项,构造方法(注意:这里是私有的),成员变量,成员方法。其中枚举项相对于正常的class它是一个新的概念,在枚举类中枚举项是就是这个类的对象(跟正常的类不一样,注意区分,下文中会举例,相信你会明白),因此它会有自己的属性(变量和方法),所以在定义枚举项时可以调用构造方法,不调用的话直接默认为无参构造方法。
public enum 枚举类名{
枚举项1,枚举项2,枚举项3...;
构造方法
成员变量
成员方法
}
使用
正常情况下,如果使用到很多常量,而这些常量可以用在同一个业务场景,那么建议使用枚举类型。例如,隔壁老王干完坏事开溜,可以选择从正门出走楼梯,也可以选择从窗户跳下去,也可以选择躲在衣柜里继续睡,这三种情况都对应着老王“逃”的这个业务场景,因此可以将这三种情况封装成枚举类型。在使用之前强调4点
- 枚举类型都继承java.lang.Enum,所以枚举类不能再继承其它类型。
- 定义枚举项时,多个枚举项之间需要使用“,”隔开,通常使用大写,因为它是一个常量,所以按照java的惯例应该使用大写。
- 枚举类型的构造方法使用private
- 通过枚举类名.枚举项名称去访问指定的枚举项
- 枚举类型可以实现接口
普通用法
示例1:不使用枚举类型
public class Escape {
public final static String DOOR = "老公没到小区";
public final static String DOOR_OPERATION = "从正门出去";
public final static String WINDOW = "老公上楼了";
public final static String WINDOW_OPERATION = "翻窗子出去";
public final static String CABINET = "老公进客厅了";
public final static String CABINET_OPERATION = "不行了,躲柜子里";
}
在不使用枚举的情况,用了一堆常量,不方便维护。
示例2:使用枚举类型
public enum EscapeEnum {
DOOR("老公没到小区","从正门出去"),
WINDOW("老公上楼了","翻窗子出去"),
CABINET("老公进客厅了","不行了,躲柜子里");
private String location;
private String operation;
private EscapeEnum() {}
private EscapeEnum(String location, String operation) {
this.location = location;
this.operation = operation;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getOperation() {
return operation;
}
public void setOperation(String operation) {
this.operation = operation;
}
}
使用枚举类型后,之前的成对常量都被封装在枚举项中了,可读性明显增强。
public class EnumTest {
public static void main(String[] args) {
EscapeEnum door = EscapeEnum.DOOR;
System.out.println(door.getLocation());
System.out.println(door.getOperation());
}
}
枚举比较
枚举的比较通过用在条件分支中,例如switch case中,if中使用的话使用"=="
示例1:switch中进行比较
public class CompareSwitchTest {
public static void main(String[] args) {
EscapeEnum escapeEnum = EscapeEnum.DOOR;
switch(escapeEnum) {
case DOOR:
System.out.println("从正门出去");
break;
case WINDOW:
System.out.println("翻窗子出去");
break;
case CABINET:
System.out.println("不行了,躲柜子里");
break;
default:break;
}
}
}
示例2:if分支中进行比较
public class CompareIfTest {
public static void main(String[] args) {
EscapeEnum escapeEnum = EscapeEnum.DOOR;
if(escapeEnum == EscapeEnum.DOOR) {
System.out.println("从正门出去");
}else if (escapeEnum == EscapeEnum.WINDOW) {
System.out.println("翻窗子出去");
}else if(escapeEnum == EscapeEnum.CABINET) {
System.out.println("不行了,躲柜子里");
}
}
}
枚举类型实现接口
枚举类型可以实现接口,实现的方式跟普通的类没什么区别。
示例:模拟HttpCode
public interface HttpCode {
int getCode();
String getDescription();
}
public enum HttpCodeEnum implements HttpCode{
SUCCESS(200,"ok"),
PAGE_NOT_FOUND(404,"page not found")
;
int code;
String description;
private HttpCodeEnum(int code, String description) {
this.code = code;
this.description = description;
}
public void setCode(int code) {
this.code = code;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public int getCode() {
return code;
}
@Override
public String getDescription() {
return description;
}
}
public class CodeTest {
public static void main(String[] args) {
HttpCode codeEnum = HttpCodeEnum.SUCCESS;
System.out.println("The code is : "+codeEnum.getCode()+
" The description is : "+codeEnum.getDescription());
}
}
结束语
至此,关于java枚举类型的知识点就介绍完了。希望本文能帮助大家,祝大家在IT之路上少走弯路,一路绿灯不堵车,测试一性通过,bug秒解!
|