单例模式中的唯一实例为什么一定要设置为静态的

单例模式中的唯一实例为什么一定要设置为静态的

这里以懒汉式的单例模式为例

public class Emperor {
    private Emperor(){}

    private static Emperor instance;

    public static Emperor getInstance(){
        if(instance==null)
            instance=new Emperor();
        return instance;
    }
}

由上述代码可见,其唯一实例和getInsance()方法都被设置为静态类型。
为什么一定要将其设置为静态的,这就要从单例模式出现的目的说起,单例模式是为了让类的使用者只会创建出一个类的实例,要想达到这样的目的:
首先,类的构造方法肯定要对其他类隐藏起来
其次,自己要创建一个实例供其他类来使用
最后,要提供一个方法给其他类来访问这个实例

看到这你可能觉得那么直接用public *** getInstance()不就好了,为什么一定要设置为静态的方法?
要想访问一个类中的方法有两个方式

  1. new一个对应类的对象,在通过对象.方法()的方式来调用成员方法
  2. 通过类名.方法名()这样来调用对应的类方法

由于单例模式中为了避免外界直接使用构造方法创建实例对象,将构造方法隐藏了起来。此时第一种方法显然无法实现,只有通过第二种方法来获取实例,所以单例模式中的getInstance()方法必须被定义为类方法,即必须加上static。
而根据Java语法的要求,在static的环境中是不允许访问非static的成员变量的(这里的原因,我的理解是由于静态方法(类方法)是跟随类加载一起被加载进来的,而普通的成员变量是在实例化对象的时候才随之产生的,如果在静态方法中访问了普通的成员变量那么就是在访问一个不存在的变量,会导致错误),所以对应的实例对象也必须被定义为类属性。
第一篇文章,多多指正

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值