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;
        }   
  • 相关阅读:
    win7,win10获取屏幕缩放适应截图
    cg语言学习&&阳春白雪GPU编程入门学习
    Unity Plugins的使用方法
    记录Unity的优化tip(不断更新)
    深入理解法线贴图原理
    读香菱学诗
    排序算法学习
    图的算法复习大纲
    Gama Space 和 Linear Space 学习
    BM算法学习
  • 原文地址:https://www.cnblogs.com/qwop/p/6637310.html
Copyright © 2011-2022 走看看