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;
        }   
  • 相关阅读:
    labview 中的一些简写全称
    socket
    putty
    在波形图表中显示多条曲线
    简单的通电延时触发电路
    Linux sed 批量替换多个文件中的字符串
    PhpMyAdmin管理,登录多台远程MySQL服务器
    MySQL客户端工具推荐
    Redis的几个认识误区
    Redis 的 5 个常见使用场景
  • 原文地址:https://www.cnblogs.com/qwop/p/6637310.html
Copyright © 2011-2022 走看看