当前位置:天才代写 > tutorial > JAVA 教程 > Effective Java(3) 用私有结构器可能列举范例强化Singleton属性

Effective Java(3) 用私有结构器可能列举范例强化Singleton属性

2017-11-02 08:00 星期四 所属: JAVA 教程 浏览:654

一、配景

所谓的Singleton是指仅仅被实例化一次的类,Singleton凡是被用来代表那些本质上独一的系统组件。

实现Singleton有以下三种要领:

①. 私有结构器,公有静态final域。

②. 私有结构器,公有静态工场要领。

③. 单位素列举范例(首选)。

二、私有结构器,公有静态final域

public class Singleton1 {  
      
    public static final Singleton1 INSTANCE = new Singleton1(); // 公有静态final域  
      
    /* 
     * 私有结构器 
     */
    private Singleton1() {  
    }  
      
}

三、私有结构器,公有静态工场要领

缺点1:享有特权的客户端可以借助AccessibleObject.setAccessible要领,通过反射机制,挪用私有结构器,假如需要抵制这种进攻,可以修改结构器,让它在被要求建设第二个实例的时候抛出异常。

public class Singleton2 {  
    private static final Singleton2 INSTANCE = new Singleton2(); // 私有静态final域  
      
    /* 
     * 私有结构器 
     */  
    private Singleton2() {  
    }  
      
    /* 
     * 公有静态工场要领 
     */
    public static Singleton2 getInstance() {  
        return INSTANCE;  
    }  
      
}

查察本栏目

缺点2:每次反序列化一个序列化的实例时,城市建设一个新的实例,为了防备这种环境,不只要实现Serializable接口,还要提供一个readResolve要领。

public class Singleton2 implements Serializable {  
    private static final long serialVersionUID = 1L;  
    private static final Singleton2 INSTANCE = new Singleton2(); // 私有静态final域  
      
    /* 
     * 私有结构器 
     */  
    private Singleton2() {  
    }  
      
    /* 
     * 公有静态工场要领 
     */  
    public static Singleton2 getInstance() {  
        return INSTANCE;  
    }  
      
    /* 
     * 反序列化确保只有一个实例 
     */
    public Object readResolve() {  
        return INSTANCE;  
    }  
      
}

四、单位素列举范例

最佳要领:更简捷,无偿提供序列化机制,绝对防备多次实例化,纵然是面临巨大的序列化或反射进攻的时候。

public enum Singleton3 {  
    INSTANCE;  
          
    public void testSingleton() {  
        System.out.println("testSingleton");  
    }  
      
    public static void main(String[] args) {  
        Singleton3.INSTANCE.testSingleton();  
    }  
}

作者:csdn博客 zdp072

 

    关键字:

天才代写-代写联系方式