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内核
    svn
    windows live writer …
    SVN服务器配置
    使用PowerDesigner创建数据库表图文并茂版
    maven学习
    在PreparedStatement中设置空值
    今天, 我的博客正式开通啦.
    Neo4j简介
    clinit和init(转载)
  • 原文地址:https://www.cnblogs.com/stono/p/8458194.html
Copyright © 2011-2022 走看看