• 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;
        }   
  • 相关阅读:
    Servlet介绍(一)
    iOS Dev (50)用代码实现图片加圆角
    Codeforces Round #265 (Div. 2) D. Restore Cube 立方体推断
    JVM:垃圾回收机制和调优手段
    Memcachedclient-XMemcached使用
    JVM中类的卸载机制
    血型统计
    iOS 事件传递及响应过程
    java 对象参数去空格方式
    spring aop 一个挡板例子
  • 原文地址:https://www.cnblogs.com/qwop/p/6637310.html
Copyright © 2020-2023  润新知