zoukankan      html  css  js  c++  java
  • 为什么要用静态内部类来实现单例模式?

    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,这样就不是单例的
    若是把这个变量直接定在方法体内,那么这个变量就是局部变量了,其他的类没办法直接通过类名访问,


  • 相关阅读:
    我的软考之路
    VB成员函数集锦
    关于软件维护问题的几点思考
    element样式调整用到的东西
    JS实现旋转的魔方
    关于echarts 重绘/图表切换/数据清空
    CSS3 @keyframes 实现匀速旋转魔方(搬运工)
    在vue的js文件引入自定义js文件
    记录 vue+element树节点的标注
    echarts 设置图例文本不可点击
  • 原文地址:https://www.cnblogs.com/javaboy2018/p/9040803.html
Copyright © 2011-2022 走看看