• 为什么要用静态内部类来实现单例模式?


    package test;

    public class Singleton {

    private static Singleton singleton;
    private Singleton(){
    System.out.println("只操作一次!");
    }
    public static class SingletonHelper{
    private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance(){
    singleton = SingletonHelper.INSTANCE;
    return singleton;
    }

    public static Singleton getInstance2(){
    singleton = new Singleton();
    return singleton;
    }

    public static Singleton getInstance3(){
    final Singleton singleton3 = new Singleton();
    return singleton;
    }

    }

    package test;

    import org.junit.Test;

    public class TestSingleton {

    @Test
    public void testSingleton(){

    for(int i=0;i<5;i++){
    //Singleton.getInstance();
    //Singleton.getInstance2();
    Singleton.getInstance3();
    }

    }

    }


    这是getInstance2();的结果,会new Singleton();多次

    只会执行一次

    根本原因在于:
    静态内部类里面使用的是
    static final Singleton INSTANCE = new Singleton();

    static final 是一个静态常量,存储在内存中的常量区,在new之前会看常量里面是否有这个值,如果有,就不再执行new操作了


    已经在成员变量中被定义成static了,
    不能被重复定义,所以singleton仍然是静态变量,
    虽然这个值在内存中同时只有一个,但是这个值是可以变的,所以可以被重新赋值,
    所以会先new,再赋值给singleton,这样就不是单例的
    若是把这个变量直接定在方法体内,那么这个变量就是局部变量了,其他的类没办法直接通过类名访问,


  • 相关阅读:
    设计模式-抽象工厂
    设计模式-工厂方法
    设计模式-简单工厂
    设计模式-单例模式
    设计模式使用指南
    适合Java程序员看的UML学习手册
    第六周 Java8新特性
    deepin15.11系统使用罗技k380键盘
    动态规划系列之六01背包问题
    《比勤奋更重要的是底层思维》
  • 原文地址:https://www.cnblogs.com/javaboy2018/p/9040803.html
Copyright © 2020-2023  润新知