一. 枚举类型的定义
- 定义
java.lang.Enum是在JDK1.5定义的. 定义为:
pubulic abstract class Enum> implements Comparable, Serializable{...}
- 编程规约:
阿里巴巴出品的编程规约
[参考]枚举类名建议带上Enum后缀, 枚举成员名称需要全大写, 单词间用下划线隔开。
说明: 枚举其实就是特殊的常量类, 且构造方法被默认和强制是私有。
正例: DealStatusEnum, 成员名称: SUCCESS/UNKOWN_REASON
二. 枚举的使用
- 基本使用
public enum RainBowEnum {
RED, ORANGE, YELLEOW, GREEN, BLUE
}
- 用法升级. 增加自定义方法
public enum RainBow2Enum {
RED(0, "彩虹-红色"),
ORANGE(1, "彩虹-橙色"),
YELLEOW(2, "彩虹-黄色"),
GREEN(3, "彩虹-绿色"),
BLUE(4, "彩虹-蓝色");
RainBow2Enum(int flag, String name) {
this.flag = flag;
this.name = name;
}
private int flag;
private String name;
}
可以枚举实例
public enum ObjectEnum {
OBJECT{
@Override
public User getUser() {
return new User("李四", "北京西路");
}
},OBJECT2{
@Override
public User getUser() {
return new User("小明");
}
};
private User user;
ObjectEnum() {
this.user = new User();
}
public abstract User getUser() ;
}
- 可以实现接口, 不能继承接口. 也不能被继承. 是final的.
- 可以定义接口组织枚举.
/**
* @author [email protected]
* @date 2019/1/14 17:40
* @description
*/
public interface OrgnizeEnums {
// 自定义水果枚举
enum FruitEnum implements OrgnizeEnums{
PEACH, GRAPE
}
// 自定义酒枚举
enum WineEnum implements OrgnizeEnums{
READ_WINE, SPIRIT
}
}
class testOrgnizeEnums{
public static void main(String[] args) {
for (OrgnizeEnums.FruitEnum fruitEnum : OrgnizeEnums.FruitEnum.values()){
System.out.println("fruitEnum::"+fruitEnum);
}
for (OrgnizeEnums.WineEnum wineEnum : OrgnizeEnums.WineEnum.values()){
System.out.println("wineEnum::"+wineEnum);
}
}
}
- 枚举集合的使用
EnumSet的元素不允许为null, EnumSet非线程安全
EnumMap的key不允许为null,value可以为null,按照key在enum中的顺序进行保存,非线程安全。
- 枚举实现单例模式
经典案例
public enum SingletonEnum {
INSTANCE;
public void otherMethods() {
System.out.println("Something");
}
}
举个例子
// 枚举类
public enum DemoEnum {
// 理解: INSTANCE是DemoEnum的实例.
INSTANCE;
// 定义INSTANCE包含参数User.
private User instance;
// 枚举类的私有构造方法. 默认是private的.
DemoEnum() {
instance = new User();
}
// 获取枚举类的具体参数user
public User getInstance() {
return instance;
}
}
@Data
@Slf4j
public class User {
private String name;
private String address;
public User() {
}
public User(String name) {
this.name = name;
}
public User(String name, String address) {
this.name = name;
this.address = address;
}
public static void main(String[] args) {
// 心得-定义 User类可以用new User();获取很多不同的实例对象. 枚举是列举出有穷序列集.
// 定义枚举类, 里面只列举出一个值, 此值代表一个User类的实例. 通过getInstance()方法可以获取到INSTANCE的值: 一个User类的实例.
// Enum: 自由序列化, 线程安全, 保证单例
// Enum是由class实现的->enum作为一个类来实现单例;
// Enum是通过继承Enum类实现的, enum不能作为子类继承其他类.也不能被继承, 是final修饰的. 但是可以用来实现接口
// Enum有且仅有private的构造器. 防止外部的额外构造.
User user1 = DemoEnum.INSTANCE.getInstance();
User user2 = DemoEnum.INSTANCE.getInstance();
User user3 = DemoEnum.INSTANCE.getInstance();
User user4 = DemoEnum.INSTANCE.getInstance();
log.info("获取的实例哈希值:{}", user1.hashCode());
log.info("获取的实例哈希值:{}", user2.hashCode());
log.info("获取的实例哈希值:{}", user3.hashCode());
log.info("获取的实例哈希值:{}", user4.hashCode());
}
}
三、枚举原码理解
Enum