zoukankan      html  css  js  c++  java
  • 单例模式的另外三种方法

    单例模式的另外三种方法

    静态内部类:

    public class MyObject {
    
        private static class MyObjectHandler{
            private static MyObject myObject = new MyObject();
        }
    
        private MyObject() {
    
        }
    
        public static MyObject getInstance() {
            return MyObjectHandler.myObject;
        }
    }

    静态内部类反序列化问题:

    import java.io.ObjectStreamException;
    import java.io.Serializable;
    
    import com.stono.thread2.ThreadPrint;
    
    public class MyObject implements Serializable {
    
        private static final long serialVersionUID = -3968427143706472470L;
    
        private static class MyObjectHandler{
            private static final MyObject myObject = new MyObject();
        }
    
        private MyObject() {
    
        }
    
        public static MyObject getInstance() {
            return MyObjectHandler.myObject;
        }
        
        protected Object readResolve() throws ObjectStreamException{
            ThreadPrint.print("调用了readResolve方法");
            return MyObjectHandler.myObject;
        }
    }

    static代码块:

    public class MyObject {
        private static MyObject myObject =  null;
    
        private MyObject() {
    
        }
        static {
            myObject = new MyObject();
        }
    
        public static MyObject getInstance() {
            return myObject;
        }
    }

    enum枚举类型:

    import java.util.Date;
    
    import com.stono.thread2.ThreadPrint;
    
    public enum MyObject {
    
        connectionFactory;
        private Date connection;
        private MyObject() {
            try {
                ThreadPrint.print("调用了MyObject的构造函数");
                connection = new Date();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public Date getConnection() {
            return connection;
        }
    }

    单一职责:

    import java.util.Date;
    
    import com.stono.thread2.ThreadPrint;
    
    public class MyObject {
    
        public enum MyEnumSingleton{
            connectionFactory;
            private Date connection;
            private MyEnumSingleton() {
                try {
                    ThreadPrint.print("调用了MyObject的构造函数");
                    connection = new Date();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            public Date getConnection() {
                return connection;
            }
        }
        
        public static Date getConnection() {
            return MyEnumSingleton.connectionFactory.getConnection();
        }
    }
  • 相关阅读:
    软件下载链接获取方法
    【转】Linux 查看端口占用情况
    [转]SpringBoot第十集:国际化与Webjars的应用(2020最新最易懂)
    【转】Vue生命周期理解(带图的哦)
    Visual Studio 2019&WebStorm&CMD 创建vue项目
    Qt-Button使用QSS变图片按钮
    Qt-滚动条QSS样式
    Qt-鼠标点击别处隐藏widget
    OSG-修改osg鼠标中轮放大缩小的操作键
    OSG-在使用单位的kit编译osgQOpenGL时提示“语法错误:"unit"的前面应有“:””
  • 原文地址:https://www.cnblogs.com/stono/p/8458194.html
Copyright © 2011-2022 走看看