java中如何创建一个不会被反射破坏的单例

前言

单例相信各位都不陌生,从学习java开始就会经常接触到这个概念,首先先来回忆一下什么是单例:

单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。


————来自百度百科。

简单来说,就是让你的对象全局只有一个,而且还是你想要别人获取到的那一个。

以下代码测试使用环境:
java版本:1.8
编译器:idea、eclipse


预热一下

那么怎么做一个单例呢?先抛开反射这种情况不说,简单的来一个小小的单例demo:

	/** 一个简单的单例demo */
	public class Singleton {
   

	/** 唯一的单例 */
    private static volatile Singleton singleton = null;
 
 	/** 构造私有化 */
    private Singleton(){
   }
 
 	/** 获取实例的工厂方法 */
    public static Singleton getSingleton(){
   
        synchronized (Singleton.class){
   
            if(singleton == null){
   
                singleton = new Singleton();
            }
        }
        return singleton;
    }    

从上面的代码我们可以看到,

  • 构造是私有的,外界无法直接通过new来创建一个新的对象实例
  • 类内存在一个私有的、静态的、被volatile修饰的字段,作为唯一单例对象。
  • 存在一个工厂方法,当唯一单例对象不存在则创建一个并保存,如果有则直接返回。同时还使用synchronized关键字来保证线程的安全。
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值