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

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


转载于:https://www.cnblogs.com/javaboy2018/p/9040803.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值