JAVA枚举简介
今天在看MyBatis源码的时候突然发现其中使用了很多枚举类,突然发现项目中好像一直没有使用过枚举,故而特别复习了一下。到底什么是枚举,能用来做什么。
枚举,是java中的一种比较特殊的class,它继承了java.lang.Enum类,也就是说在枚举类中是不能够继承其他类的(java单根继承,將枚举类的.class文件反编译,就可以看到它继承了哪个类了。),但可以实现接口。枚举更像是一个有限常量的集合,类似于数学中的A={1,2,3,4}。当你使用枚举时,只能使用枚举内已经存在的。枚举内的元素默认被public static final修饰,是不是很眼熟?像是常量?在枚举中,每一个元素都是有自己的序号的,从0开始,我们可以通过元素名称来确定枚举类中元素的位置,也可以通过枚举类中元素的序号来确定元素的位置。不多BB,贴码;
package com.my.test;
public enum TestEnum implements Enumeration {
// 测试元素
TYPE("test",1),
// 已删除元素
DELETE(1),
// 未删除元素
NOT_DELETE(0),
// 新版删除标识符元素
BE_DELETE(0,1);
// 局部变量,用于获取对应常量的值(int类型)
private int value;
// 局部变量,用户获取对应常量的值,(String类型)
private String str;
// 已删除
private int delete;
// 未删除
private int notDelete;
// 有参构造方法,枚举类默认使用无参构造方法。
TestEnum(int value) {
this.value = value;
}
// 有参构造
TestEnum(String str,int testInt){
this.str = str;
this.value = testInt;
}
TestEnum(int delete,int notDelete){
this.delete = delete;
this.notDelete = notDelete;
}
public int getDelete() {
return delete;
}
public void setDelete(int delete) {
this.delete = delete;
}
public int getNotDelete() {
return notDelete;
}
public void setNotDelete(int notDelete) {
this.notDelete = notDelete;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public void test() {
}
}
简述一下上面的那个枚举类,根据实际情况,数据库中逻辑删除标识符一般都是一个整数类型字段,用0来标识未删除(false)用1来标识已删除(true)一般我们会在常量类中声明
public static final DELETE = 1; public static final NOT_DELETE = 0;
这样的常量声明会有一些问题,比如
1. 类型不安全。比如在一个方法中要求传入形参,用常量的话,形参就是int类型,开发者传入任意类型的int类型值就可以,但是如果是枚举类型的话,那就只能传入枚举类中包含的对象。
2. 没有命名空间。开发者要在命名的时候以一定的格式来确定这个常量的使用范围,比如是四季的话就是SEASON_SPRING表示春天,这样另外一个开发者再看这段代码的时候才知道这四个常量分别代表季节。
在上面的枚举类例子中,拿BE_DELETE来举例,在枚举类中声明一个用于表示是否删除的元素BE_DELETE在使用的时候
package com.my.test;
public class TestEnumCode {
public static void main(String[] args) {
int delete = TestEnum.BE_DELETE.getDelete();
int notDelete = TestEnum.BE_DELETE.getNotDelete();
System.out.println(delete + "-------" + notDelete);
}
}
这样就可以获取到对应的具体数值了。
除此之外,枚举还可以应用于switch分支判断,记得switch 支持的数据类型里就有枚举。使用时在case表达式中可以直接写入枚举值,不需要加入枚举类作为限定。
虽然如此,枚举这个东西还真的很少用到。总结枚举常使用的情况,当我们要从另一个函数得到一个值,并且这个值在一定范围内的,这个时候我们就可以通过枚举来定义个这个范围。同时也可以做到限制另外一个函数能够传递进来的值只能够是枚举类型里面的元素。