美文网首页
Android(Java)枚举单例

Android(Java)枚举单例

作者: 清蒸鱼跃龙门 | 来源:发表于2020-06-29 10:09 被阅读0次

常规方式

  • 懒汉式 DCL「双重检测锁:Double Checked Lock」
public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton() {
    }
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    // 延迟初始化
                    instance  = new Singleton();
                }
            }
        }
        return instance;
    }
}

优点:线程安全;延迟加载;效率较高。
缺点:由于volatile关键字会屏蔽Java虚拟机所做的一些代码优化,略微的性能降低。

  • 饿汉式(静态常量)
public class Singleton {
    private final static Singleton INSTANCE = new Singleton();
    private Singleton() {
    }
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

缺点:使用静态final的实例对象或者使用静态代码块依旧不能解决在反序列化、反射、克隆时重新生成实例对象的问题(见参考1)

枚举方式

  • 饿汉式枚举单例
public enum T {
    SPRING,SUMMER,AUTUMN,WINTER;
}
// 反编译之后可知枚举中的各个枚举项是通过static来定义的
public final class T extends Enum
{
    //省略部分内容
    public static final T SPRING;
    public static final T SUMMER;
    public static final T AUTUMN;
    public static final T WINTER;
    private static final T ENUM$VALUES[];
    static
    {
        SPRING = new T("SPRING", 0);
        SUMMER = new T("SUMMER", 1);
        AUTUMN = new T("AUTUMN", 2);
        WINTER = new T("WINTER", 3);
        ENUM$VALUES = (new T[] {
            SPRING, SUMMER, AUTUMN, WINTER
        });
    }
}
  • 懒汉式枚举单例(枚举+内部类)
enum LanguageEnum {
    INSTANCE;
    private static class Language {
        public String realName(String name) {
            return "Language " + name;
        }
    }

    private Language instance = null;
    private LanguageEnum() {
        instance = new Language();
    }
    
    // 实际对外开放的两个方法
    public Language getLanguage() {
        return instance;
    }
    
    public void printlnLanguageName(String name) {
        String str = getLanguage().realName(name);
        System.out.println(str);
    }
}
demo

使用枚举的好处:

  • 定义的代码少,主要是系统帮忙做了文中反编译那部分。
  • 线程安全

参考1:孔乙己的疑问:单例模式有几种写法
参考2:【单例深思】枚举实现单例原理

相关文章

  • 单例模式(Java内部类加载顺序)

    你真的会写单例模式吗——Java实现Android设计模式源码解析之单例模式深度分析 Java 的枚举类型:枚举的...

  • Android(Java)枚举单例

    常规方式 懒汉式 DCL「双重检测锁:Double Checked Lock」 优点:线程安全;延迟加载;效率较高...

  • 枚举单例

    描述 本文先反编译枚举,再使用枚举实现单例 枚举 单例 单例源码 单例反编译 引用 http://www.benf...

  • 11.1设计模式-单例模式-详解

    单例模式: 单例介绍 单例的六种写法和各自特点饿汉、懒汉、懒汉安全、DCL、静态内部类、枚举。 android中的...

  • 单例模式中为什么用枚举更好

    枚举单例(Enum Singleton)是实现单例模式的一种新方式,尽管单例模式在java中已经存在很长时间了,但...

  • 通过枚举实现单例模式

    枚举单例(Enum Singleton)是实现单例模式的一种新方式,尽管单例模式在java中已经存在很长时间了,但...

  • 单例模式中为什么用枚举更好

    枚举单例(Enum Singleton)是实现单例模式的一种新方式,尽管单例模式在java中已经存在很长时间了,但...

  • JAVA基础之单例

    JAVA单例的几种形式以及其优缺点。 Android 中的单例模式 - 简书 单例的定义:Singleton模式的...

  • 单例模式之枚举类enum

    通过枚举实现单例模式 枚举类实现单例模式的优点 对于饿汉式单例模式和懒汉式单例模式了解的同学,使用以上两种单例模式...

  • 单例模式(Singleton)

    单例模式(Singleton) 枚举单例 public enum Singleton { INSTANCE; ...

网友评论

      本文标题:Android(Java)枚举单例

      本文链接:https://www.haomeiwen.com/subject/rcanfktx.html