首页 > 编程语言 >java中私有构造函数的作用

java中私有构造函数的作用

时间:2023-01-03 10:35:26浏览次数:51  
标签:singleton java 私有 Elvis final 实例 public 构造函数


使用私有构造函数强化singleton属性。 方法一:公有的静态成员是一个final域,成员的声明很清楚的表达了这个类是一个singleton。 public class Elvis {

public static final Elvis INSTANCE = new Elvis();  
private Elvis() { }
public void leaveTheBuilding() {
System.out.println("This is singleton.");
}

public static void main(String[] args) {
Elvis elvis = Elvis.INSTANCE;
elvis.leaveTheBuilding();
}

}

私有的构造函数仅被调用了一次,用来实例化公有的静态final域Elvis.INSTANCE; 由于缺少公有的或者受保护的构造函数,所以保证了Elvis的全局唯一性。 一旦Elvis类被实例化之后,只有一个Elvis实例存在。 方法二:提供一个公有的静态工厂方法,而不是公有的静态final域。该方式提供了更大的灵活性,在不改变API的前提下,可以把该类改成singleton或者非

singleton的。 public class Elvis {  
private static final Elvis INSTANCE = new Elvis();
private Elvis() { }

public static Elvis getInstance() { return INSTANCE; }

public void leaveTheBuilding() {
System.out.println("This is singleton.");

}
public static void main(String[] args) {
Elvis elvis = Elvis.getInstance();
elvis.leaveTheBuilding();
}
}

总结:第一种方法效率稍微高一些,采用第一种方法实现singleton后,就没有改变的余地了,当你想把该类改成非singleton,显然是不行的了。 所以,除非确实该类是一个singleton,那就用第一个方法吧。用第2种方法的时候,假如该类实现了serializable接口,那应该重写readResolve()方法, 否则再反序列化的时候是会产生一个新的实例,这与singleton相违背了!

2.通过私有的构造函数强化不可实例化的能力.



在面向对象程序设计中,假如存在太多只有静态属性和静态方法的类;那么,面向对象的思想可能在这会损失殆尽。



但是,并不能说面向对象的程序中就不应该出现只有静态属性和静态方法的类,相反,有时候我们还必须写这样的类作为工具类。



这样的类怎么实现呢?有人可能会把该类定义成抽象类(Abstract class),的确,抽象类是不可以实例化的,但是别忘了还有继承,



继承了抽象类的子类在实例化时候,默认是会先调用父类无参数的构造函数的(super();),这时候,父类不是也被实例化了嘛?



其实我们可以这样做,把该类的构造函数定义为私有的(private),而类的内部又不调用该构造函数的话,就成功了。



这样带来的后果就是该类成了 final的,不可能再被任何类继承了,要被继承,得提供一个公有(public)的或者保护(protect)的构造函数, 这样才能被子类调用。

标签:singleton,java,私有,Elvis,final,实例,public,构造函数
From: https://blog.51cto.com/u_15928064/5984662

相关文章

  • java内存管理
    1.java是如何管理内存的 Java的内存管理就是对象的分配和释放问题。(两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型......
  • Java程序员必看的 13 本 Java 书籍!
    关乎于程序员,除了做项目来提高自身的技术,还有一种提升自己的专业技能就是:多!看!书! 毕竟,书是学习的海洋呢!So,Java程序员你们准备好了吗?双手奉上Java程序员必读之热门书单。......
  • 初识Java
    初识JavaJava的特性和优势简单性就是c++语法的纯净版。没有头文件,指针运算,结构,联合,操作符重载,虚基类等等。面向对象面向对象是一种程序设计技术,他将重点放在数据(即对......
  • java中的HashSet的add()方法解析
     HashSet的add()方法解析示例代码如下:【可用于后续的源码追踪】1publicclassHomeWork04{2publicstaticvoidmain(String[]args){3HashS......
  • Javascript公共脚本库系列(二): 添…
    一.摘要本系列文章是为了抽象通用的,跨浏览器的脚本方法.本篇文章为我们的轻量级脚本库增加添加多播委托的方法.可以实现"单击页面空白区域则关闭页面上所有弹出层"等类似的......
  • java笔试题大全带答案(java笔试题大全带答案下载)
    谁有2008,2009,2010年计算机JAVA笔试试题和答案呢?2008年计算机Java笔试试题及答案2009年计算机考试Java笔试试题和答案2010年计算机考试Java笔试试题和答案下面地址也许有......
  • 第一章:Java开发环境搭建
    感谢动力节点(放弃幻想,认清现实)1.知识框架2.计算机编程语言发展史?第一代语言:机器语言程序员直接编写二进制,一串二进制代码,例如:10010100010010001000..........
  • Java个人家乡博客源码
    概述个人博客相册家乡主题,用户注册后可以发布关于家乡的特色文章介绍,可以发布照片,相册管理,留言,评论,回复,收藏,关注演示视频https://www.bilibili.com/video/BV1iy4y1x7w6......
  • Java开发的党员管理系统党员会议系统党务管理系统
    简介Java开发的大学生党员管理系统,主要功能会议,会议记录,会议主持,设置参会人员,请假申请,会议内容附件上传下载,党费管理,入党积极分子预备党员管理,人员变动,入党,表现评价等。主......
  • Java同学录系统同学录网站
    简介用户注册可以创建班级(创建者即为群主),用户也可以查找班级申请加入,群主添加同学的联系方式等,可以在班级里留言,管理相册等,还可以指定其他人为群主或者解散班级群,群里的用......