Java中的枚举是一个很容易被大家遗忘的知识点,鄙人在工作中也很少使用枚举,最近仔细整理了一下相关知识点吗,发现用好枚举可以为开发带来很多长处。
枚举早在JDK1.5就被引入了,应该是比较古老的特性了,那枚举具体可以用在哪些场景下呢?
1、常量的定义
2、switch的入参
3、单例模式的实现
在WEB开发中,经常需要封装一个ResponseDto类来返回一些调用的结果信息,如下:
/**
* @author Administrator
* @date 2019/3/17
*/
public enum ResponseDto {
//定义两个实例,一个表示请求成功,一个表示请求失败
HTTP_200(200,"请求成功"), HTTP_500(500,"请求失败");
//枚举和普通的类一样,可以定义属性,构造函数,getter setter,普通方法,
private Integer code;
private String msg;
ResponseDto(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
public void setCode(Integer code) {
this.code = code;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
/**
* @author Administrator
* @date 2019/3/17
*/
public class Test05 {
public static void main(String [] args){
System.out.println(ResponseDto.HTTP_200);
System.out.println(ResponseDto.HTTP_500);
System.out.println(ResponseDto.HTTP_200==ResponseDto.HTTP_200);
System.out.println(ResponseDto.HTTP_200.equals(ResponseDto.HTTP_200));
System.out.println(ResponseDto.HTTP_200.getMsg());
System.out.println(ResponseDto.HTTP_500.getMsg());
}
}
结果
HTTP_200
HTTP_500
true
true
请求成功
请求失败
注意结果:==和equal都是true,这好像与两个普通对象比较的结果不太一样,我们都知道==比较的其实是对象的地址,相等意味着什么呢,意味着两个对象其实就是同一个对象,这是枚举的一个重要特性,也就是说枚举对象是单例的,一种对象只会在内存中保存一份。
总结来说:1、枚举和普通的类一样,有属性,get,set方法,构造函数。2、枚举继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类,但是可以实现接口,实现接口的时候需要实现接口中定义的所有方法,若没有完全实现,那这个枚举类就是抽象的,只是不需显式加上abstract修饰,系统化会默认加上。3、枚举对象是天生单例。
利用枚举实现单例模式
单例模式主要有5中方式实现,懒汉式、饿汉式、静态内部类,双中检测锁,枚举。这里我们主要聊一聊利用枚举的方式实现单例模式。
/**
* @author Administrator
* @date 2019/3/17
*/
public class User {
//私有化构造函数
private User(){ }
//定义一个静态枚举类
static enum SingletonEnum{
//创建一个枚举对象,该对象天生为单例
INSTANCE;
private User user;
//私有化枚举的构造函数
private SingletonEnum(){
user=new User();
}
public User getInstnce(){
return user;
}
}
//对外暴露一个获取User对象的静态方法
public static User getInstance(){
return SingletonEnum.INSTANCE.getInstnce();
}
}
/** * @author Administrator * @date 2019/3/17 */ public class Test05 { public static void main(String [] args){ System.out.println(User.getInstance()); System.out.println(User.getInstance()); System.out.println(User.getInstance()==User.getInstance()); } }
结果:
User@1540e19d
User@1540e19d
true
本人介绍:研究生期间主要从事NLP学习和研究,毕业后在银行从事2年Java后端开发,目前在一家垂直领域TOP1互联网公司大数据部门工作。以下是我运营的一个公众号,会不定期发布一些文章,主要记录工作中使用到的技术和面临的技术难题,涉及后端,大数据和系统架构方面的知识,欢迎大家订阅交流。