【面试题】Java单例设计模式-饿汉式枚举(enum)单例

一、enum关键字

enum关键字是在Java1.5也就是Java SE5之后引入的一个新特性:它通过关键字enum来定义一个枚举类,这个被定义的枚举类继承Enum类,这个枚举类算是一种特殊类,它同样能像其他普通类一样拥有构造器、方法,也能够实现接口,但是它不能再继承其他别的类,因为它的直接父类是Enum类,并且因为它默认的修饰符有final的存在,因此它无法直接派生出其他子类,除非将其使用abstract修饰。

按照《Java编程思想》中的原话来说:关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件来使用。

在枚举类出现之前Java是将常量放在接口或是放在普通类当中,然后使用public、static、final去修饰定义的常量,如下两个例子:

public interface Constants2 {
    public static final int CONSTANT_1 = 1;
    public static final int CONSTANT_2 = 2;
    public static final int CONSTANT_3 = 3;
}

public class Constants {
    public static final int CONSTANT_1 = 1;
    public static final int CONSTANT_2 = 2;
    public static final int CONSTANT_3 = 3;
}

在枚举类型出现之后,就可以使用枚举类型来定义常量,这些枚举类型成员_1、_2、_3都默认被public、static、final修饰,语法如下:

public enum Constants {
    CONSTANT_1,
    CONSTANT_2,
    CONSTANT_3
}

但是Java枚举类型输出其常量的时候不像C /C++的枚举那样是数字,输出的是其常量名,如果需要输出其类型成员声明时数字次序的话,需要调用ordinal()方法:

public enum Singleton2 {
    SHERLOCK,
    WASTON;
}

class Main{
    public static void main(String[] args) {
        System.out.println(Singleton2.SHERLOCK);
        System.out.println(Singleton2.WASTON);
        System.out.println(Singleton2.SHERLOCK.ordinal());
        System.out.println(Singleton2.WASTON.ordinal());
    }
}

输出结果:
SHERLOCK
WASTON
0
1

二、枚举单例的实现

单例模式的特点有以下三个:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

我们可以发现枚举类型十分契合以上三个特点,并且我们通过创建枚举类型,可以发现它其中每一个类型成员其实都是Singleton2这个枚举类的一个实例。

public enum Singleton2 {
    SHERLOCK
}

class Main{
    public static void main(String[] args) {
        Singleton2 sherlock = Singleton2.SHERLOCK;
        Singleton2 sherlock1 = Singleton2.SHERLOCK;
        System.out.println(sherlock == Singleton2.SHERLOCK);
        System.out.println(sherlock == sherlock1);
        System.out.println(Singleton2.SHERLOCK.getDeclaringClass());
    }
}

输出结果:
true
true
class com.sherlock.singleton.Singleton2

利用这个特性,我们就可以通过如下代码创建单例,同时又因为这个特性,决定了它只能属于饿汉式单例模式

public enum Singleton2 {
    SHERLOCK;
    public void print() {
        System.out.println("I am Sherlock!");
    }
}

class Main{
    public static void main(String[] args) {
        Singleton2 sherlock = Singleton2.SHERLOCK;
        System.out.println(Singleton2.SHERLOCK.getDeclaringClass());
        sherlock.print();
    }
}

输出结果如下:

class com.sherlock.singleton.Singleton2
I am Sherlock!

三、枚举单例的优缺点

优点:

(1)能够避免多线程同步问题;

(2)能够防止反序列化重新创建对象;

(3)实现比起其它懒汉式、饿汉式单例来说十分简洁,阅读性好;

缺点:

(1)因为是饿汉式加载,所以会导致枚举实例会长期存在于内存当中;

(0)

相关推荐

  • 枚举实现单例模式

    枚举实现单例模式

  • 初级必备:单例模式的7个问题

    故事 实话实说,关于单例模式,网上有N多个版本.你估计也看过很多版本.但看完了又能怎样?我技术群里的一位小伙伴,上周面试,就因为一个单例模式,然后叫他回去等通知了. 下面是这位同学被问到的问题: 1. ...

  • 图解Java设计模式之单例设计模式

    图解Java设计模式之单例设计模式 设计模式介绍 设计模式类型 单例设计模式介绍 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全,同步代 ...

  • 为什么建议你使用枚举?

    枚举是 JDK 1.5 新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春.夏.秋.冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如错误码等. 枚 ...

  • 设计模式之单例模式(Singleton Pattern),太简单了

    基本定义 单例模式就是确保某一个类只有一个实例,并且提供一个全局访问点.单例模式有如下几个特点: 它只有一个实例. 它必须要自行实例化. 它必须自行向整个系统提供访问点. 代码实现 饿汉式 直接初始化 ...

  • 面试高频-吃透单例设计模式

    单例设计模式 单例设计模式的介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法). 比如 Hiber ...

  • 设计模式:单例模式 (关于饿汉式和懒汉式)

    定义 单例模式是比较常见的一种设计模式,目的是保证一个类只能有一个实例,而且自行实例化并向整个系统提供这个实例,避免频繁创建对象,节约内存. 单例模式的应用场景很多, 比如我们电脑的操作系统的回收站就 ...

  • 单例设计模式

    单例设计模式 什么是设计模式 静态方法和属性的经典使用 设计模式是:在大量的实践中总结和理论化之后优选的代码结构.编程风格以及解决方法 什么是单例模式 单个实例的设计模式 所谓类的单例设计模式,就是采 ...

  • Java校招笔试题-Java基础部分(三)

    导语   Java 面试题集2021版 Java基础部分三 26.说说has a 与is a的区别   is-a表示的是属于的关系,也就是说马是属于动物的一种表示的是一种继承的关系.   has-a ...

  • Java动态代理设计模式

    本文主要介绍Java中两种常见的动态代理方式:JDK原生动态代理和CGLIB动态代理. 什么是代理模式 就是为其他对象提供一种代理以控制对这个对象的访问.代理可以在不改动目标对象的基础上,增加其他额外 ...

  • 玉米这桌席都吃仨月了就是不见上量 这还叫饿汉聚餐吗

    今天,国内主产区玉米收购价格继续保持上涨态势. 其中,七星柠檬科技 涨1分,执行2210元/吨:德州邦基玖瑞 涨1分,执行2180元/吨:山东百盛生物 涨1分,执行2320元/吨:临清金玉米 涨1分, ...

  • 一口气扫走3亿,汉溪万博大单频频,你看懂了吗?

    终于,黑石还是拿下了SOHO中国. 2021年中,全球私募巨头黑石集团,完成了一笔商业地产"史诗级交易",以30.4亿美元(折合人民币约192亿),买下了SOHO中国91%的股份. ...

  • 详解JAVA面向对象的设计模式 (七)、装饰模式

    装饰模式 Decorator 装饰模式比较简单,我就不单独写实现例子了.参考设计图去实现不是什么问题.建议可以写一写找找感觉. 在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修.相 ...