大多数不熟悉Java的开发人员在没有指定至少一个显式构造函数的情况下 ,会很快了解到为其Java类隐式创建了“ 默认构造函数 ”( 由javac )。 Java语言规范的 8.8.9节简要指出:“如果一个类不包含构造函数声明,则将隐式声明一个默认构造函数。” 该部分进一步描述了隐式创建的默认构造函数的特征,包括它不带参数,不带throws子句,以及调用类似地不接受任何参数的其超类的构造器。 Java开发人员可以选择显式实现类似于默认构造函数的无参数构造函数(例如,不接受任何参数且不包含throws子句)。 在本文中,我探讨了一些开发人员可能决定实现显式无参数构造函数而不是依赖于隐式默认构造函数的原因

明确指定无参数构造函数的一些原因

排除类的实例化

实施显式无参数构造函数的常见原因是,避免使用public可访问性隐式创建默认构造函数。 如果类具有其他显式构造函数(接受参数),则这是不必要的步骤,因为任何显式构造函数的存在都会阻止隐式默认构造函数的生成。 但是,如果不存在其他显式构造函数(例如,在具有所有static方法的“实用程序”类中),则可以通过实现具有private访问权限的显式无参数构造函数来排除隐式默认构造函数。 Java语言规范的 8.8.10节描述了使用所有private显式构造函数来防止类的实例化。

通过Builder或静态初始化工厂强制类实例化

显式实现private无参数构造函数的另一个原因是,通过静态初始化工厂方法或构造器而不是构造函数来强制实例化该类的对象。 Effective Java (第三版)的前两项概述了使用静态初始化工厂方法和生成器比直接使用构造器的优势。

需要多个构造函数,包括无参数构造函数

实现无参数构造函数的一个明显原因可能是与上面讨论的原因一样普遍或更常见,这是当需要无参数构造函数时,但需要参数的构造函数也是如此。 在这种情况下,由于存在其他期望参数的构造函数,因此必须显式创建无参数构造函数,因为永远不会为已经具有一个或多个显式构造函数的类隐式创建默认构造函数。

使用Javadoc构建文档对象

显式实现无参数构造函数而不是依赖隐式创建的默认构造函数的另一个原因是在构造函数上表达Javadoc注释。 这是JDK-8224174 (“ java.lang.Number具有默认构造函数”)的既定理由,该理由现在是JDK 13的一部分,并且也以当前未解决的JDK-8071961表示 (“当默认构造函数为已创建”)。 最近编写的CSR JDK-8224232 (“ java.lang.Number具有默认构造函数”)详细说明了这一点:“默认构造函数不适用于有据可查的API。”

显性优先于隐性优先

与隐式创建相比,某些开发人员通常更喜欢显式规范。 在Java中,可以在显式规范或隐式对应之间进行选择。 如果开发人员重视沟通方面或假定显式构造函数具有更高的可读性,则他们可能更喜欢显式无参数构造函数而不是隐式构造函数。

在JDK中用显式无参数构造函数替换默认构造函数

在JDK中,有些情况下,隐式默认构造函数已被显式无参数构造函数代替。 其中包括:

  • JDK 9中已解决的JDK-8071959 (“ java.lang.Object使用隐式默认构造函数”)用显式的无参数构造函数代替了java.lang.Object的“默认构造函数”。 阅读该问题的“描述”使我微笑:“在修改java.lang.Object( JDK-8071434 )上的某些文档时,注意到该类*没有*具有显式构造函数,而是依靠javac创建隐式默认构造函数。 多么尴尬!”
  • JDK 9中已解决的JDK-8177153 (“ LambdaMetafactory具有默认构造函数”)用显式(和private )无参数构造函数代替了隐式默认构造函数。
  • JDK 13计划的JDK-8224174 (“ java.lang.Number具有默认构造函数”)将用显式无参数构造函数替换java.lang.Number的隐式默认构造函数。

关于默认构造函数的潜在javac lint警告

有一天, javac可能会收到可用的lint警告,以指出具有默认构造函数的类。 JDK-8071961 (“当创建默认构造函数时添加javac lint警告”)目前尚不适用于任何特定的JDK版本,它指出:“ JLS第8.8.9节记录了,如果一个类没有声明至少一个构造函数,编译器默认会生成一个构造函数。 尽管此策略可能很方便,但是对于正式类,如果没有其他原因导致默认构造函数没有Javadoc,则这是一种不良的编程习惯。 使用默认构造函数可能是合理的javac lint警告。”

结论

依赖于在编译时创建的默认构造函数绝对很方便,但是在某些情况下,即使不需要显式指定,显式指定无参数构造函数也可能更为可取。

翻译自: https://www.javacodegeeks.com/2019/05/explicit-arguments-constructor-versus-default-constructor.html

显式无参数构造函数与默认构造函数相关推荐

  1. 构造函数调用默认构造函数_显式无参数构造函数与默认构造函数

    构造函数调用默认构造函数 大多数不熟悉Java的开发人员都会Swift了解到,如果他们没有指定至少一个显式构造函数,则会为Java类隐式创建一个" 默认构造函数 "( 由javac ...

  2. java默认参数构造函数_Java的构造函数与默认构造函数(深入版)

    前言 我们知道在创建对象的时候,一般会通过构造函数来进行初始化.在Java的继承(深入版)有介绍到类加载过程中的验证阶段,会检查这个类的父类数据,但为什么要怎么做?构造函数在类初始化和实例化的过程中发 ...

  3. python有参函数和无参函数的区别_构造函数的有参和无参的区别,构造函数的参数是派什么用场的?...

    展开全部 区别: 1.如果在创建对象时不写参数,调用的就32313133353236313431303231363533e58685e5aeb931333366303861是无参的构造方法.可是如果你 ...

  4. 默认构造函数和拷贝构造函数

    构造函数 构造函数包括默认构造函数.拷贝构造函数和一般构造函数. 在编程时,如果程序员不显式声明和定义上述函数,编译器将自动产生4个public inline的默认函数. A();          ...

  5. 类的构造函数和析构函数、默认构造函数

    前言 程序只能通过成员函数来访问数据成员,因此需要设计合适成员函数,才能成功地将对象初始化. 类构造函数专门用于构造新对象,将值赋给他们的数据成员,进行初始化. 构造函数名称与类名相同,没有返回值,没 ...

  6. c++ 虚函数_到底什么情况下会合成默认构造函数?

    来源:https://www.cnblogs.com/QG-whz/p/4676481.html 作者:good luck 编辑:公众号[编程珠玑] 编辑注:没有构造函数的时候编译器一定会生成默认构造 ...

  7. C/C++编程:默认构造函数的建构操作

    C++标准提出:默认构造函数会在需要的时候被编译器生成.那什么时候被需要?被谁需要?做什么呢? class Foo{public:int val;Foo *next; };void foo_bar() ...

  8. 默认构造函数,=default,=delete

    //默认构造函数: (1)定义:不带参数的构造函数就是默认构造函数 例如:class A {public:A();}; A::A()//默认构造函数 {}A a;//可以如果我们没有写默认构造函数,那 ...

  9. C++学习——默认构造函数

    默认构造函数在这篇博客中已经写得很明白. https://blog.csdn.net/bear_n/article/details/72798301 文章目录 1.什么是默认构造函数? 2.什么情况会 ...

最新文章

  1. QPixmap: It is not safe to use pixmaps outside the GUI thread原因
  2. java运行过程_Java执行过程
  3. UA MATH571B 试验设计IV RCBD与Latin Square上
  4. java 特殊符号正则_java利用正则表达式处理特殊字符的方法实例
  5. matlab画爱心代码分享
  6. Windows活动目录(域服务器)经典系列图文教程
  7. 对冲基金表现大盘点(二):Citadel
  8. Notebook左侧开启导航
  9. 超微服务器主板型号,Supermicro超微主板X10SRL-FLGA-2011,单路入门级服务器主板
  10. 利用Depends查看win系统下exe程序的依赖项
  11. 套路得人心之我的运营之路!(文末有福利)
  12. win10关闭windows聚焦_关于Windows 10 Windows聚焦功能失效
  13. 微信小程序分享给朋友和分享到朋友圈
  14. 动手学深度学习(tensorflow)---学习笔记整理(五、过拟合和欠拟合相关问题篇)
  15. 5G核心网中与用户数据相关的NF功能体UDM、AUSF、PCF、UDR
  16. ie浏览器使用video标签无法播放mp4文件 完美解决方案
  17. 网上打印店可以急速打印东西吗?
  18. SSD固态硬盘优化设置图文教程
  19. 【剑指Offer】整数(一)整数除法 - 两数相除 - JavaScript
  20. Window 开机连接ocsp.globalsign.com

热门文章

  1. 数学知识总结——矩阵
  2. codeforces E. Game with String 概率
  3. 2017西安交大ACM小学期 选择困难症[折半枚举+二分查找]
  4. 2017西安交大ACM小学期数论 [等差数列]
  5. java反射 修改静态方法的值 setAccessible
  6. 通往大神之路,百度Java面试题前200页。
  7. 【Java】jdk和eclipse下载安装
  8. 《白鹿原》金句摘抄(五)
  9. mybatis报错Type interface xxx.Dao is not known to the MapperRegistry
  10. sql事务、视图和索引