前言
枚举、注解、反射是三个Java中最重要,也是最容易被忽视的三个技术。很多人只知道利用框架机械性地使用它们,但是对原理掌握不扎实,下面一起从根本来理解它们。
一、枚举
1.1 枚举简介
JDK1.5引入了一个新的类型——枚举
在JDK1.5之前,我们定义常量都是:
public static final xxx
很难去管理。
而枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
枚举:用于定义有限数量的一组同类常量,例如:
-
错误级别:
低、中、高、紧急 -
一年四季:
春、夏、秋、冬 -
商品的类型:
美妆、手机、电脑、男装、女装…
在枚举类型中定义的常量是该枚举类型的实例
1.2 枚举定义格式
在JDK1.5之前, 我们定义一个类型的常量的方式:
//JDK1.5之前描述级别的方式:
public class Level {
private int levelValue; //私有属性值
private Level(int levelValue){
//封装构造方法,让外部无法直接利用构造方法创建对象
this.levelValue = levelValue;
}
//接下来使用公开静态常量属性的方式,来创建对象
//用户可以通过类名.常量名获取这些常量,获取的常量就是一个Level类型
//然后通过.getLevelValue()方法获取它的值
public static final Level LOW = new Level(1);
public static final Level MIDDLE = new Level(2);
public static final Level HIGH = new Level(3);
public int getLevelValue() {
return levelValue;
}
public void setLevelValue(int levelValue) {
this.levelValue = levelValue;
}
}
以上的方式,显然代码量有点冗余,而且并不好提供一些常量对比方法。
枚举定义方式:
权限修饰符 enum 枚举类型名称{
实例1,实例2,实例3....;
}
例如:
public enum Level {
//描述枚举类型(创建对象)
LOW(1),
MIDDLE(2),
HIGH(3);
private int levelValue; //正常私有属性
private Level2(int levelValue){
//正常私有构造方法
this.levelValue = levelValue;
}
public int getLevelValue() {
return levelValue;
}
public void setLevelValue(int levelValue) {
this.levelValue = levelValue;
}
}
此时的代码量就比较简洁了,甚至还可以这样:
//不赋值,直接通过名字从字面意义上判断大小
public enum Level {
//描述类型的对象(后面可以跟括号,也可以不跟)
LOW,MIDDLE,HIGH;
//无私有属性
//私有无参构造(可省略)
//private Level3(){}
}
可以通过字面意思直接判断Level类型的状态,也可以通过自定义的方法来实现比较规则等。
1.3 枚举类的主要方法
Enum抽象类常见方法
Enum是所有Java枚举类型的公共基本类(注意Enum是抽象类),以下是它的常见方法:
返回类型 | 方法名称 | 方法说明 |
---|---|---|
int |
compareTo(E e) |
比较此枚举与指定对象的顺序 |
boolean |
equals(Object o) |
当指定对象等于此枚举类型时,返回true |
Class<?> |
getDeclaringClass() |
返回此枚举常量的枚举类型对应的Class对象 |
String |
name() |
返回此枚举常量的名称,在其枚举声明中对其进行声明 |
int |
ordinal() |
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零) |
String |
toString() |
返回枚举常量的名称,它包含在声明中 |
static<T extends Enum<T> T> |
static valueOf(Class<T> enumType, String name) |
返回带有指定名称的指定枚举类型的枚举常量 |
comareTo
以下方枚举为例:
public enum Level3 {
LOW, MIDDLE, HIGH;
}
此方法按照枚举对象定义的顺序来作为比较的依据,与值无关
int a = Level3.LOW.compareTo(Level3.MIDDLE); //a = -1
int b = Level3.LOW.compareTo(Level3.HIGH); //b = -2
int c = Level3.HIGH.compareTo(Level3.LOW); //c = 2
valueOf
Level3 level = Enum.valueOf(Level3.class,"LOW");
此时的 level 就是 Level3 的 LOW 对象
1.4 实现接口的枚举类
所有的枚举都是继承自java.lang.Enum
类,由于Java不支持多继承,所以枚举对象不能再继承其他类。
每一个枚举对象,都可以实现自己的抽象方法
示例接口:
public interface LShow{
void show();
}
public enum Level3 implements LShow {
LOW(){
@Override
public void show() {