使用枚举实现单例模式

原创 2017年08月10日 11:32:20

前言

单例模式的实现方式有多种,从最基础的非LazyLoad的懒汉式,到LazyLoad但需要双重检查的饿汉式,再到比较简单实现LazyLoad的静态内部类方式,均可实现单例模式。(忘了的可以查查资料:D)不过使用枚举实现单例模式,可称之为实现单例模式最简单的方法。

实现

public enum MySingleton {
    INSTANCE;   

    // all the methods you want
    private String hello() {
        System.out.println("Hello, world!");
    }
}

需要使用单例时,直接MySingleton.INSTANCE即可得到枚举对象。调用对象的方法,如MySingleton.INSTANCE.hello(),以实现需要的功能。

说明

为什么枚举类能这么简单实现单例?回顾一下单例的两个经典模式所需的条件:

  • 懒汉式:private构造函数,提前new,需要时直接return;
  • 饿汉式:private构造函数,需要时再new,导致了double check;

再看枚举,符合构造函数为private,且在首次调用的时候使用构造函数构造枚举对象。因此枚举完全可以胜任单例的工作,而且是LazyLoad,并且不需要双重检查。

https://stackoverflow.com/questions/26285520/implementing-singleton-with-an-enum-in-java

Q:
I have read that it is possible to implement Singleton in Java using an Enum such as:

public enum MySingleton {
INSTANCE;
}
But, how does the above work? Specifically, an Object has to be instantiated. Here, how is MySingleton being instantiated? Who is doing new MySingleton()?

A:
This,

public enum MySingleton {
INSTANCE;
}
has an implicit empty constructor. Let’s be explicit instead,

public enum MySingleton {
INSTANCE;
private MySingleton() {
System.out.println(“Here”);
}
}
If you then added another class with a main() method like

public static void main(String[] args) {
System.out.println(MySingleton.INSTANCE);
}
You would see

Here
INSTANCE
enum fields are compile time constants, but they are instances of their enum type. And, they’re constructed when the enum type is referenced for the first time.

版权声明:本文为博主原创文章,未经博主允许不得转载。

浅谈使用单元素的枚举类型实现单例模式

简介 使用单元素的枚举实现单例模式简介通常情况下,我们写单例模式的时候无非就是三个步骤:构造器私有化,声明私有静态变量,提供静态获取实例的方法。简单说就是以下这种方式:class SingletonA...
  • huangyuan_xuan
  • huangyuan_xuan
  • 2016年08月12日 22:47
  • 5675

Java枚举实现单例模式

单例模式约束一个类只能实例化一个对象。在Java中,为了强制只实例化一个对象,最好的方法是使用一个枚举量。这个优秀的思想直接源于JoshuaBloch的《EffectiveJava》(《Java高效编...
  • horace20
  • horace20
  • 2014年07月08日 13:00
  • 23699

Java 利用枚举实现单例模式

引言单例模式比较常见的实现方法有懒汉模式,DCL模式公有静态成员等,从Java 1.5版本起,单元素枚举实现单例模式成为最佳的方法。Java枚举基本用法枚举的用法比较多,本文主要旨在介绍利用枚举实现单...
  • yy254117440
  • yy254117440
  • 2016年08月24日 23:50
  • 18248

使用枚举实现绝对单例

单例模式是开发中用的最多的设计模式之一,在诸如数据库连接池、配置文件读取等业务场景广泛使用。单例的Java实现大家都知道有两种方式,最初的英文文档翻译者为其起了很有趣的名字:“懒汉式”和“饿汉式”,当...
  • u012109386
  • u012109386
  • 2016年04月20日 17:42
  • 618

通过枚举实现单例模式

实现单例的核心在于private私有化类中的构造方法,在枚举中的构造方法必须是私有的,当一个枚举类中只有一个枚举时只会调用一次枚举的构造方法,这就为枚举来实现单例奠定了基础。下面以数据源中获得Conn...
  • liu88010988
  • liu88010988
  • 2016年03月03日 16:18
  • 365

单元素枚举类实现单例模式

本文转载自:点击打开链接 Inspired by Effective Java. Singleton模式是在编程实践中应用最广泛的几种设计模式之一。以前知道的,实现单例的方法有两种(下...
  • see__you__again
  • see__you__again
  • 2016年06月03日 15:15
  • 1641

为什么java中用枚举实现单例模式会更好

枚举单例是java中使用枚举提供一个实例对象来实现单例模式的一种新方法,虽然单例模式在java中早已存在,但枚举单例实际上从java5引入枚举作为它的关键特性之后相对来说还是一个新的概念,这篇文章和我...
  • normallife
  • normallife
  • 2016年04月14日 15:58
  • 2561

JAVA单例模式的各种写法分析,最优为枚举

作用 单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点 适用场景 应用中某个实例对象需要频繁的被访问。 应用中每次启动只会存在一...
  • tianyazaiheruan
  • tianyazaiheruan
  • 2016年02月03日 10:26
  • 4210

单例模式之使用enum枚举数据类型实现

枚举enum和静态代码块的特性想死,在使用枚举类时,构造方法会被自动调用, 也可以应用这个特性实现单例模式。 package test; public class MyObject { ...
  • anLA_
  • anLA_
  • 2017年04月16日 14:39
  • 992

单例模式的八种写法比较、枚举实现的好处、静态内部类实现单例原理

目录 简介 基本的实现思路 注意事项 单例模式的八种写法 1、饿汉式(静态常量)[可用] 2、饿汉式(静态代码块)[可用] 3、懒汉式(线程不安全)[不可用] 4、懒汉式(线程安全,同步方法...
  • a_long_
  • a_long_
  • 2016年04月13日 10:49
  • 2880
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用枚举实现单例模式
举报原因:
原因补充:

(最多只允许输入30个字)