zoukankan      html  css  js  c++  java
  • EffectiveJava(3)使用是由构造器或枚举类型强化singleton

    使用是由构造器或枚举类型强化singleton

    普通singleton:借助AccessibleObject.setAssess方法,通过反射机制调用私有构造器.抵御这种攻击可以修改构造器,让其再被要求创建第二个实例的时候抛出异常
    //允许创建一个实例,当通过反射调用private 构造方法时,抛出异常组织创建
    public static StrongSingletonByConstr getInstance(){
    return SSBC;//公有域方法
    }
    公有域方法的特点:组成类的成员的声明很清楚的表明了这个类是Singleton
    在性能上不再有优势
    工厂方法的优势:灵活

    2.声明中加上implements Serializable,声明所有实例域都是瞬时的,并提供一个readResolve方法.

    3.编写一个包含单个元素的枚举类型:简洁,无偿的提供了序列化机制,绝对防止多次实例化
    最佳

    /**
         * serialVersionUID
         */
        private static final long serialVersionUID = -7257523614444332475L;
        public static final StrongSingletonByConstr SSBC = new StrongSingletonByConstr();
    
        private StrongSingletonByConstr(){
    
        }
    
    
        //只有当类不包含显式的构造器时,编译器才会生成缺省的构造器,因此只要让这个类包含私有构造器,他就不能被实例化
    //  private StrongSingletonByConstr{
    //      throw new AssertionError();//非必需..>>避免在类的内部调用构造器
    //  }
    
        //允许创建一个实例,当通过反射调用private 构造方法时,抛出异常组织创建
        public static StrongSingletonByConstr getInstance(){
            return SSBC;
        }
    
        public void leaveTheBuilding(){}
    
        //防止每次反序列化一个序列化的实例时,都创建一个新的实例
        private Object readResolve(){
            return SSBC;
        }   
  • 相关阅读:
    【Demo 0062】文件遍历
    【Demo 0068】获取分区信息
    【Demo 0060】记录个人信息
    【Demo 0069】文件读写
    【Demo 0064】监控文件/目录变更
    【Demo 0067】文件类型关联图标
    【Demo 0065】获取被修改的文件/目录
    【Demo 0062】目录及文件基本操作
    【Demo 0061】打开与保存文件
    【Demo 0066】监控被变更文件/目录(完成端口)
  • 原文地址:https://www.cnblogs.com/qwop/p/6637310.html
Copyright © 2011-2022 走看看