枚举学习
About 3 minjavaenum
原理
枚举本质上是通过普通的类来实现的,只是编译器为我们进行了处理。每个枚举类型都继承自java.lang.Enum, 并自动添加了values和valueOf方法。而每个枚举常量是一个静态常量字段,使用内部类实现,该内部类继承了枚举类。所有枚举常量都通过静态代码块来进行初始化,即在类加载期间就初始化。另外通过把clone、readObject、writeObject这三个方法定义为final的,同时实现是抛出相应的异常。这样保证了每个枚举类型及枚举常量都是不可变的。可以利用枚举的这两个特性来实现线程安全的单例。(来源:https://blog.csdn.net/u010142437/article/details/80498020)
作用
- 枚举可以代替常量,枚举提供了比常量更多的方法。
- 使用枚举,能让我们的代码可读性更强。
注意事项
- 枚举类名建议带上Enum后缀
- 枚举成员名称需要全部大写
- 单词间用下划线分割
- 阿里规约【强制】:所有的枚举类型字段必须要有注释,说明每个数据项的用途。
- 枚举类型对象之间的值比较,是可以使用==,直接来比较值,是否相等,不是必须使用equals方法
特性
- 它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
- 所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义
- 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
- Enum默认实现了java.lang.Comparable接口。
- Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.
- Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.
- 因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。
- Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。
- Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。
常用方法
package com.test.utils;
/**
* @ClassName EnumExample
*/
public enum EnumExample {
// 红色
RED(1,"红色"),
// 蓝色
BLUE(2, "蓝色"),
// 黑色
BLACK(3, "黑色");
private int index;
private String name;
// 添加普通方法
public static String getName(int index){
for(EnumExample e : EnumExample.values()) {
if(e.index == index) {
return e.name;
}
}
return null;
}
EnumExample(int i, String name) {
this.index = i;
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
System.out.println(EnumExample.getName(2)); // 蓝色
EnumExample enumExample = EnumExample.BLACK;
System.out.println(enumExample.index + ":" + enumExample.name); // 3:黑色
for(EnumExample e : EnumExample.values()) { // 遍历枚举
System.out.println(e.index + ":" + e.name);
}
}
}