zoukankan      html  css  js  c++  java
  • 《effective java》读书札记第三条用私有构造器或者枚举类型强化Singleton属性

    Singleton指只被实例化一次的类。一般用来搞那些创建很耗资源或者要求系统中只能有一个实例的类。

    这个很经常使用。记得曾经实习面试的时候就有这个面试题。

    一般採用的方法是将构造器私有化,然后提供一个static变量,再提供一个static的public方法用来返回static实例:

    //Singleton with static factory
    public class Elvis {
    private static final Elvis INSTANCE = new Elvis();
    private Elvis() {}
    public static Elvis getInstance(){
    return INSTANCE;
    }
    public void leaveTheBuilding(){}
    }

    这个是单例工厂方法模式中的饿汉模式,另一种懒汉模式。

    就是晚点实例化。就不写了

    要提醒一点的是:享有特权的 client能够通过反射机制调用私有构造器。也就是平时说的暴力反射。详细能够參考我的还有一篇文章:java暴力反射。假设须要抵御这样的攻击,能够改动构造器。让它在被要求创建第二个实例的时候抛出异常。

    除了工厂方法另一种是公有域方法:
    public class Elvis2 {
    
    public static final Elvis2 INSTANCE = new Elvis2();
    private Elvis2(){}
    public void leaveTheBuilding(){}
    }


    这样的方法的长处就是清晰。明了。

    缺点就是死板,性能不行。工厂方法长处就是灵活。

    缺点就是能够非常easy被改动。比方改成为每一个调用该方法的线程返回一个唯一的实例。另外这两种方法使这个类变成是可序列化的比較麻烦。

    。。。所以讲第三种方法:





    public enum Elivis3 {
    INSTANCE;
    public void leaveTheBuilding(){}
    }
    

    这种方法在功能上与公有域方法相近,可是它更加简洁。无偿地提供了序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或者反射攻击的时候。

    尽管这样的方法还没有广泛採用。可是但元素的枚举类型已经成为实现Singletong的最佳方法!


  • 相关阅读:
    动手动脑
    编写一个程序,用户输入两个数,求出其加减乘除,并用消息框显示计算结果
    实验报告
    《大道至简第二章读后感》
    《大道至简》第一章读后感
    CentOS 6.x 播放 mp3 音乐 —— 成功
    CentOS下通过rdesktop连接Windows远程桌面
    Linux之文件系统的简单操作
    Linux之档案管理
    如何判断raid1中哪块硬盘损坏?
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5076991.html
Copyright © 2011-2022 走看看