利用枚举实现单例模式

本文介绍了Java中枚举的应用,强调了其作为单例模式实现的优势。枚举对象在内存中只存在一份,确保了单例的线程安全和唯一性。通过枚举实现单例模式避免了传统实现方式可能存在的并发问题,同时枚举还可以包含方法和属性,方便拓展。此外,文章还提及枚举的其他常见用途,如常量定义和作为switch语句的参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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互联网公司大数据部门工作。以下是我运营的一个公众号,会不定期发布一些文章,主要记录工作中使用到的技术和面临的技术难题,涉及后端,大数据和系统架构方面的知识,欢迎大家订阅交流。

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值