zoukankan      html  css  js  c++  java
  • Effective Java2读书笔记创建和销毁对象(二)

    第3条:用私有构造器或者枚举类型强化Singleton属性

    这一条,总体来说,就是讲了一个小技巧,将构造器声明为private,可以实现单例。具体有以下几种实现的方式。

    ①最传统的单例实现模式,可能有很多变种,核心思想是私有化构造器。

    public class Singleton {
    
        private static final Singleton INSTANCE = new Singleton();
        
        private Singleton(){};
        
        public static Singleton getInstance(){
            return INSTANCE;
        }
        public static void main(String[] args) {
            Singleton.getInstance();
        }
    
    }

    ②用枚举类型实现,更加简洁,无偿提供序列化机制,能够绝对防止多次实例化(方法①如果使用序列化仍可生成多个实例),即使是面对复杂的序列化或者反射攻击的时候。虽然这种方法还没有广泛采用,但是单元素的枚举类型已经成为实现Singleton的最佳方法

    public enum Singleton {
        INSTANCE;
        
        private String s;
    
        public String getS() {
            return s;
        }
    
        public void setS(String s) {
            this.s = s;
        }
        
    }

    其实enum反编译出来本质上仍然是一个类,也可以有自己的属性和方法。

    第4条:用私有构造器强化不可实例化的能力

    这里其实也讲的是一个小技巧。比如说,我们平时经常写工具类,工具类不希望被实例化,实例化对它没有任何意义。

    第一种解决方案是将工具类做成抽象类,但是这样还是不行,因为这样子类继承后仍然可以实例化。

    因此,当一个类不需要被继承也不需要被实例化时,只要让这个类的构造器私有化,就可以达到这个效果。

    public class Util {
        //私有化构造函数,迫使不能实例化
        private Util(){};
        
        public static String getStrOfObject(Object o){
            //将Object转换为String的方法,略
            return "";
        }
        
        public static String parseDateToYYYYMMDD(Date d){
            //将Date转换为2016-03-05这种格式的方法,略
            return "";
        }
    }

    作者: 张万帆
    欢迎任何形式的转载,但请务必注明出处。

  • 相关阅读:
    A JavaScript Tree component which implements the J.Q.Walker II layout algorithm
    决策树Ecotree(转)
    Elasticsearch中关于transform的一个问题分析
    转发sqlserver http://www.cnblogs.com/jiazengtao/archive/2013/05/29/3102803.html
    时间GMT
    C#去掉json字符串中的换行符
    收藏的好的Jquery+css3
    存储过程中日期的转换
    关于头文件
    关于头文件
  • 原文地址:https://www.cnblogs.com/ZhangWanFan/p/5246246.html
Copyright © 2011-2022 走看看