Java单例之enum实现方式

传统的两私有一公开(私有构造方法、私有静态实例(懒实例化/直接实例化)、公开的静态获取方法)涉及线程安全问题(即使有多重检查锁也可以通过反射破坏单例),

目前最为安全的实现单例的方法是通过内部静态enum的方法来实现,因为JVM会保证enum不能被反射并且构造器方法只执行一次。

实现方法如下:

测试方法:

扩展应用,观察下面的例子

这是一个很常见的类内部的静态资源初始化的写法(其实也就是单例的另外一种表现-只执行一次),但是将代码都写在static块下会看起来很不优雅,可以利用上面的enum单例模式来进行初始化操作。

见例子:

import java.util.ArrayList;import java.util.List;/**
 * 初始化的优雅实现
 * 可以在static处调用,
 * 也可以在普通方法里调用,都保证只初始化一次
 * 
 * 当然将enum块的代码直接放到StaticInitTest类的private static 方法里做也是可以的
 *
 * @author yzl
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选) */public class StaticInitTest {    private static List<Integer> dataList = null;    
    static{
        dataList = Singleton.INSTANCE.init();
    }    
    /**
     * 
     * 单例模式来填充数据
     *
     * @author yzl
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)     */
    private static enum Singleton {
        INSTANCE;        private List<Integer> list;        
        private Singleton(){
            fillData();
        }        /**
         * 
         * 初始化数据
         *
         * @see [相关类/方法](可选)
         * @since [产品/模块版本](可选)         */
        private void fillData(){
            list = new ArrayList<Integer>(5);            for(int i =1; i<6; i++){
                list.add(i);
            }
        }        /**
         * 
         * 初始化的入口
         *
         * @see [相关类/方法](可选)
         * @since [产品/模块版本](可选)         */
        public List<Integer> init(){            return list;
        }
    }
}

原文发布于微信公众号 - JAVA高级架构(gaojijiagou)

原文发表时间:2018-04-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

C++ 虚拟继承

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继 承自类A,因此在类D...

2028
来自专栏JetpropelledSnake

RESTful源码笔记之RESTful Framework的APIview, Viewset总结分析

官方文档:http://www.django-rest-framework.org/ drf为我们提供强大的通用view的功能,本博客对这些view进行简要的总...

621
来自专栏web前端-

JavaScript基础概述

    1.常量: 常量就是在程序运行过程中,不会发生变化的量,常量通常用来表示固定不变的量,比如圆周率,万有引力常量

482
来自专栏一“技”之长

Swift解读专题二——基本类型 原

        Swift语言的常量和变量在使用之前,必须被定义。常量用于处理程序中只在初始化时设置的量值,之后不能进行赋值改变,变量用于处理程序中可以进行改变...

483
来自专栏web编程技术分享

小兔JS教程(五) 简单易懂的JSON入门

2697
来自专栏CDA数据分析师

工具丨用C语言扩展Python的功能

一、简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多...

1729
来自专栏iOS开发攻城狮的集散地

run timeimport : 成员变量、类、方法

1549
来自专栏大前端_Web

从前端模块化的概念来理解Webpack

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

923
来自专栏林冠宏的技术文章

由 System.arraycopy 引发的巩固:对象引用 与 对象 的区别

作者:林冠宏 / 指尖下的幽灵 腾讯云+社区:https://cloud.tencent.com/developer/user/1148436/acti...

1979
来自专栏程序你好

C# 7.3新特性一览

843

扫码关注云+社区