在《秒懂java,对于创建一个java对象,你真的会吗?》一文中,讲述了java如何创建一个对象以及如何更优雅的创建对象。此外,java里还有一种比较特殊的创建对象的方式:私有构造器创建对象。

java私有构造器

私有构造器就是一个类的构造方法的访问权限定义为private,它只能被包含它的类自身所访问,而无法在类的外部调用,故而可以阻止对象的生成。这就好比现代社会的一夫一妻制,这个private的私有构造方法就类似这种约束制度,类就是一大老爷们,私有构造方法创建的对象就好比是这个大老爷们明媒正娶的老婆。

在上面的内部类Husband就是一个只有私有构造器的类。我们通常使用私有构造器这种手段来实现单例(Singleton)。Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。

java反射对私有构造器的访问

本来一夫一妻制度挺好的,但是有时候丈夫经常在外面应酬,看见其他漂亮的女人也难免心动,经不住诱惑,于是就会出轨,就会有情人,就会有小三小四甚至还有了小孩。私有构造器的约束本来也是挺好的,但也不能完全做到一个类只有一个实例,我们可以通过Java反射机制来实现对类的私有构造方法的访问从而创建新的对象:

java私有构造实现单例多线程问题

上面的例子中,类加载的时候就会直接new一个静态对象出来,在不使用同步锁的情况下实现了线程安全,当系统中这样的类较多时,会使得启动速度变慢。由于一个男孩子不可能一出生就立刻找老婆,只有等到他达到法定结婚年龄后才会娶妻生子。到达法定结婚年龄从我们系统的角度叫“适时加载”,就是在第一次使用的时候才初始化该类对象:

上面的代码中,getInstance方法被锁住,如果调用这个方法的线程很多,将导致很多线程阻塞在这里,粒度有点大,我们只需要锁住创建对象的那部分即可,下面是改进的getInstance方法:

总结

java私有构造器是实现单例(Singleton)模式的有效形式,但在使用过程中要考虑多线程问题以及合适的时机创建对象。单例模式就类似于一夫一妻制,适时加载对象就好比要达到婚育年龄才允许结婚。看完这篇《秒懂java,java私有构造器与一夫一妻制》, 你是否get到了呢?

java单例模式构造器初始化_秒懂java单例模式,java私有构造器与一夫一妻制相关推荐

  1. java编程思想 初始化_《java编程思想》_第五章_初始化与清理

    初始化和清理是涉及安全的两个问题,java中采用了构造器,并额外提供了"垃圾回收器",对于不再使用的内存资源,垃圾回收器能自动将其释放. 一.用构造器确保初始化 java中,通过提 ...

  2. java类成员初始化_简单了解Java类成员初始化顺序

    这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类中包含7中成员: 1.静态变量 static 2 ...

  3. java arraylist 初始化_一不小心就让Java开发踩坑的fail-fast是个什么鬼?

    什么是fail-fast 首先我们看下维基百科中关于fail-fast的解释: In systems design, a fail-fast system is one which immediate ...

  4. java 虚拟机 初始化_【深入理解Java虚拟机】类的初始化过程

    类的初始化过程 类的加载过程.png 加载 将 Class 文件以二进制的形式加载到内存中 验证 校验 Class 文件是否安全,是否被正确的修改等 准备 为类变量申请内存,设置默认值,(初始化变量的 ...

  5. 单例模式应用场景_三、单例模式详解

    4.单例模式详解 4.1.课程目标 1.掌握单例模式的应用场景. 2.掌握IDEA环境下的多线程调试方式. 3.掌握保证线程安全的单例模式策略. 4.掌握反射暴力攻击单例解决方案及原理分析. 5.序列 ...

  6. java 基础 笔试题_非常全面的java基础笔试题

    1.下列说法正确的是() (程序结构) A java程序的main方法必须写在类甩面 B java程序中可以有多个main方法 C.java程序中类名必须与文件名一样 D.JAVA程序的main方法中 ...

  7. java byte 判断相等_你真的了解Java中quot;==quot;和equals()的区别?

    部分面试资料链接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA 密码:jsam 想获得全部面试必看资料,关注公众号,大家可以在公众号后台回复" ...

  8. java 开发书籍 目录_《零基础 Java 开发 》全书目录

    第1部分 Java开发基础 第一章 搭建Java开发环境 1.1 Java简介 1.2 Java开发环境搭建 1.3 Java语⾔的功能 1.4 使用Eclipse开发Java程序 1.5 使用IDE ...

  9. java class 文件分析_大概优秀的java程序员都要会分析class文件吧

    相信大家在学java的时候都会听到这样的一些结论: enum 是一个类 泛型的实现使用了类型擦除技术 非静态内部类持有外部类的引用 需要将自由变量声明成final才能给匿名内部类访问 ... 初学的时 ...

最新文章

  1. markdown 使用
  2. CentOS 为Tomcat安装系统级Apr
  3. 三角数字(某年南理工研究生入学上机试题)
  4. 听说你想从事中间件开发?
  5. DataGrid方法标注
  6. 机器学习算法一览(附python和R代码)
  7. 2张表,轻松搞定你的收入问题
  8. 阿里开发规范文档_华为阿里等技术专家15年开发经验总结:SSM整合开发实战文档...
  9. Amazon Glacier的Scala客户端
  10. 独家总结| 一文读懂卡尔曼滤波
  11. Weblogic java生成wlfullclient.jar
  12. iOS 指纹识别常见问题汇总
  13. java中遍历Map几种方法
  14. 【转】数据库常用面试题
  15. 操作系统——四种进程调度算法模拟实现(C语言)
  16. Cadence16.6 最新83号补丁下载-Hotfix_SPB16.60.083_wint_1of1.exe
  17. 如何将照片裁剪为圆形?教你一招图片裁剪的技巧
  18. 微信分享 无法获取到分享状态的问题-微信分享功能调整
  19. iPhone6无法开机、不能开机的解决方法
  20. MPAndroidChart使用(BarChart为例)

热门文章

  1. 为什么批量注册Facebook账号需要使用指纹浏览器防关联
  2. MySQL数据库基础操作(一)
  3. java全栈系列之JavaSE-面向对象(封装详解)034
  4. 有赞996刷屏:男程序员们,别再低头写代码了
  5. ES6+(前端面试题整合)
  6. PCB线路板||检查和避免PCB电路板短路的方法
  7. 小程序后台数据交互-个人中心
  8. 中国人必须知道的76个常识。。。看了才发现,自己知道的实在太少了。。。
  9. 字节跳动2020春招后端开发工程师笔试复盘
  10. 算法工程师-机器学习-数据科学家面试准备[外企和国外公司、春招、秋招]