zoukankan      html  css  js  c++  java
  • JAVA 枚举单例模式

     1、枚举单例模式的实现  

    public enum Singleton {
        INSTANCE {
    
            @Override
            protected void read() {
                System.out.println("read");
            }
    
            @Override
            protected void write() {
                System.out.println("write");
            }
    
        };
        protected abstract void read();
        protected abstract void write();
    }

     

    2、枚举单例模式的优点

    1、线程安全

      原因:从反编译后的类源码中可以看出也是通过类加载机制保证的反编译后的源码

    public abstract class Singleton extends Enum
    {
    
        private Singleton(String s, int i)
        {
            super(s, i);
        }
    
        protected abstract void read();
    
        protected abstract void write();
    
        public static Singleton[] values()
        {
            Singleton asingleton[];
            int i;
            Singleton asingleton1[];
            System.arraycopy(asingleton = ENUM$VALUES, 0, asingleton1 = new Singleton[i = asingleton.length], 0, i);
            return asingleton1;
        }
    
        public static Singleton valueOf(String s)
        {
            return (Singleton)Enum.valueOf(singleton/Singleton, s);
        }
    
        Singleton(String s, int i, Singleton singleton)
        {
            this(s, i);
        }
    
        public static final Singleton INSTANCE;
        private static final Singleton ENUM$VALUES[];
    
        static 
        {
            INSTANCE = new Singleton("INSTANCE", 0) {
    
                protected void read()
                {
                    System.out.println("read");
                }
    
                protected void write()
                {
                    System.out.println("write");
                }
    
            };
            ENUM$VALUES = (new Singleton[] {
                INSTANCE
            });
        }
    }

    2、不会因为序列化而产生新实例

      不会因为序列化而产生新实例原因:枚举类自己实现了readResolve()方法,所以抗序列化,这个方法是当前类自己实现的(待验证)防止反射攻击

    3、防止反射攻击

      由反编译类源码可知单例类的修饰是abstract的,所以没法实例化。

  • 相关阅读:
    [BZOJ3195][Jxoi2012]奇怪的道路
    [codeforces696B]Puzzles
    [codeforces464D]World of Darkraft
    [COGS1000]伊吹萃香 最短路
    [BZOJ4653][NOI2016]区间 贪心+线段树
    [BZOJ4540][HNOI2016]序列 莫队
    [BZOJ4870][Shoi2017]组合数问题 dp+矩阵乘
    Loj 2005 相关分析
    Loj 114 k大异或和
    bzoj 2212 Tree Rotations
  • 原文地址:https://www.cnblogs.com/oskyhg/p/8766122.html
Copyright © 2011-2022 走看看