目录
1.认识枚举
枚举是java5加入的特性了,说起来也不算是新的东西了,枚举有很多深入的用法,这里只说一些简单的用法。因为太复杂的我也不懂,下面定义一个简单的枚举,这就是一个最简单的枚举。
public enum Type {
OPEN, CLOSE
}
所有的枚举都是Enum的子类,首先枚举是一个特殊的class,编译器会生成一个相关的类,这个类继承自java.lang.Enum,这个class相当于final static修饰,不能被继承,他的构造方法强制被私有化,由于Java 不支持多继承,所以枚举对象不能再继承其他类。
2.常用的API
一般来说我们希望每个枚举实例都可以返回自己的描述
package com.wx1.test4;
/**
* User: Mr.Wang
* Date: 2019/10/29
*/
public enum NoticeSendTypeE {
EMAIL("email"),
SITE_MESSAGE("siteMessage"),
EMAIL_AND_SITE_MESSAGE("emailAndSiteMessage");
private String typeName;
private static final String STRING = "lalal";
NoticeSendTypeE(String typeName) {
this.typeName = typeName;
}
/**
* 根据类型的名称,返回类型的枚举实例。
*
* @param typeName 类型名称
*/
public static NoticeSendTypeE fromTypeName(String typeName) {
for (NoticeSendTypeE type : NoticeSendTypeE.values()) {
if (type.getTypeName().equals(typeName)) {
return type;
}
}
return null;
}
public String getTypeName() {
return this.typeName;
}
}
NoticeSendTypeE email = NoticeSendTypeE.EMAIL;
System.out.println(NoticeSendTypeE.EMAIL.toString()); //EMAIL
NoticeSendTypeE email2 = Enum.valueOf(NoticeSendTypeE.class, "EMAIL");
NoticeSendTypeE[] values = NoticeSendTypeE.values();
email1.getTypeName() //email
通过Class来拿 和values 方法差不多,values是编译器插入的静态方法
NoticeSendTypeE[] enumConstants = NoticeSendTypeE.class.getEnumConstants();
3.枚举的常用方式
- 静态导入
这样可以不用显示的修饰枚举实例
package com.wx1.test3;
import com.wx1.test4.NoticeSendTypeE;
import static com.wx1.test4.NoticeSendTypeE.*;
/**
* 枚举的静态导入
*/
public class Test3 {
private NoticeSendTypeE noticeSendTypeE;
public Test3(NoticeSendTypeE noticeSendTypeE) {
this.noticeSendTypeE = noticeSendTypeE;
}
public static void main(String[] args) {
Test3 test3 = new Test3(EMAIL);
}
}
- switch是要在有限的可能值集合中进行选择,因此他与eunm正是绝佳组合。
一般switch都是整型的数值,枚举天生就具备整型数值的次序,需要注意的是在case语句中使用break,如果不写default,那么必须确保覆盖所有的实例,,如果case语句中写return就需要写default.
String s1 = "email";
NoticeSendTypeE email3 = NoticeSendTypeE.EMAIL;
switch (NoticeSendTypeE.fromTypeName(s1)) {
case EMAIL:
email3 = NoticeSendTypeE.SITE_MESSAGE;
break;
case SITE_MESSAGE:
email3 = NoticeSendTypeE.EMAIL_AND_SITE_MESSAGE;
break;
case EMAIL_AND_SITE_MESSAGE:
email3 = NoticeSendTypeE.EMAIL;
break;
}
- 枚举实现接口
枚举实现接口可以给枚举的实例分组
package com.wx1.test4;
import com.wx.test19.Generator;
import java.util.Random;
/**
* User: Mr.Wang
* Date: 2019/10/31
*/
public enum Type implements Generator<Type> {
OPEN("open"),
CLOSE("close");
private String typeName;
private Random random = new Random(47);
Type(String typeName) {
this.typeName = typeName;
}
public static Type fromTypeName(String typeName) {
for (Type type : Type.values()) {
if (type.getTypeName().equals(typeName)) {
return type;
}
}
return null;
}
public String getTypeName() {
return this.typeName;
}
@Override
public Type next() {
return this.values()[random.nextInt(values().length)];
}
}
每个枚举变量都是枚举类ColorEnum的实例,相当于RED=new ColorEnum(1),按序号来。每个成员变量都是final static修饰。定义一个枚举:
public enum Shrubbery {
GROUND,
CRAWLING,
HANGING
}
历遍枚举,取枚举的值:
public static void main(String[] args) {
Shrubbery[] values = Shrubbery.values();
for (Shrubbery value : values) {
System.out.print(value+"::"+value.ordinal()+"::");
System.out.print(value.compareTo(Shrubbery.CRAWLING)+"::");
System.out.print(value.equals(Shrubbery.CRAWLING)+"::");
System.out.print(value.getDeclaringClass()+"::");
System.out.println(value.name());
}
}
ordinal返回枚举变量的序号,这个values返回的是一个实例化枚举的对象的数组。name返回的是实例化对象的名字,在枚举的实例上调用getDeclaringClass(),就可知道其所属的枚举类。
- 覆盖枚举的方法
覆盖toString方法,改变枚举示例名字的输出格式
/**
* 枚举的覆盖方法
*/
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//覆盖方法
@Override
public String toString() {
return this.index + "_" + this.name;
}
}
- EnumSet EnumMap 使用他们的好处就是速度快
EnumSet<NoticeSendTypeE> noticeSendTypeES
= EnumSet.of(NoticeSendTypeE.EMAIL, NoticeSendTypeE.SITE_MESSAGE);
for (NoticeSendTypeE noticeSendTypeE : noticeSendTypeES) {
System.out.println(noticeSendTypeE.getTypeName());
}
- 还可以为枚举实例编写方法
这可以使每个枚举实例具备自己独特的行为
- 使用枚举创建单例模式
创建安全的单例最好的方法
参考博客:
https://blog.csdn.net/newbie_907486852/article/details/81027512