构造函数调用默认构造函数

大多数不熟悉Java的开发人员都会Swift了解到,如果他们没有指定至少一个显式构造函数,则会为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的开发人员在没有指定至少一个显式构造函数的情况下 ,会很快了解到为其Java类隐式创建了" 默认构造函数 "( 由javac ). Java语言规范的 8.8. ...

  2. java 序列化声明_显式声明默认Java类序列化方法的原因是什么?

    我定期看到具有以下结构的Java类: class MyClass implements Serializable { private static final long serialVersionUI ...

  3. python构造函数调用成员函数_成员函数中的Python调用构造函数

    让我们以这个类为例,它正在扩展MySQLDB的connection对象.在class DBHandler(mysql.connections.Connection): def __init__(sel ...

  4. python的类型化_显式类型化的Python版本?

    从python3开始,使用类型注释的能力通过PEP 3017引入到python标准中.快速前进到python3.5和typing模块,该模块允许指定变量的类型或函数的返回类型.在from typing ...

  5. 默认选中_双击dwg图纸,怎么设置默认天正打开?

    文尾左下角阅读原文看视频教程 好课推荐: 零基础CAD:点我CAD室内:点我 周站长CAD:点我CAD机械:点我 Bim教程:点我CAD建筑:点我CAD三维:点我全屋定制:点我 ps教程:点我苹果版C ...

  6. mysql不显示默认密码_免安装版mysql不出现默认密码状况(基于mysql8.0)

    可以使用免密码安装命令 mysqld --initialize-insecure(建议使用这个命令) mysqld install net start mysql 然后启动了 进入mysql: mys ...

  7. 如何查看mysql默认字符集_如何找出MySQL中的默认服务器字符集?

    您可以使用系统变量character_set_server来了解MySQL中的默认服务器字符集.以下是语法-SHOW VARIABLES LIKE 'character_set_server'; 另外 ...

  8. sysctl 默认值_设置Linux内核参数 /etc/sysctl.conf

    设置Linux内核参数 /etc/sysctl.conf 配置 Linux 内核参数修改后不用重启动更新: /sbin/sysctl -p 打开/etc/sysctl.conf 复制如下内容 kern ...

  9. python 测试用例的无输入_如何为无参数方法自动生成测试用例?

    为了减少boiler-plate代码,我想出了在类测试仪中为所有无参数方法生成测试用例的想法.在 跑步时py.测试,它只识别静态编写的测试用例(测试a.测试b),而不识别使用setattr(Teste ...

最新文章

  1. php 回收周期(Collecting Cycles)
  2. Mysql基础运维及复制架构——PRIT非完整恢复
  3. 098 Validate Binary Search Tree 验证二叉搜索树
  4. 《101 Windows Phone 7 Apps》读书笔记-BABY MILESTONES
  5. 重构javascript_JavaScript代码清理:如何重构以使用类
  6. 中国互联网史是一部流氓史
  7. 利用Python制作一个“电子记事本”
  8. 在服务端合并和压缩JavaScript和CSS文件[转]
  9. 类似纪念碑谷的unity2d素材包_《纪念碑谷》:引领小清新风格的2.5D插画风游戏...
  10. 微信发红包功能的测试用例
  11. JavaEE - 正则表达式、日期时间类、Math、Random、System、Runtime、大数值运算类
  12. Linux教程(第5版)习题部分习题及答案
  13. X64dbg-插件开发-字符编码-常用插件函数-回调结构
  14. 美团校招实习生面试一面
  15. 计算机组成原理实验二 存储器实验
  16. 手机APP系统开发流程
  17. java软件工程师工作业绩_java软件工程师,工作总结
  18. 计算机网络的产生与发展
  19. 怪物猎人ns联机显示与服务器连接发生错误,怪物猎人世界网络连不上怎么办?联机失败问题解决方法...
  20. 【英语面试】二.计算机专业英语面试常见问题(研究方向/前沿技术/本科毕设篇)

热门文章

  1. JavaWeb --第二章 Tomact详情
  2. P4783-[模板]矩阵求逆
  3. P5494-[模板]线段树分裂
  4. 2021“MINIEYE杯”中国大学生算法设计超级联赛(7)部分题解
  5. P4027-[NOI2007]货币兑换【斜率优化dp,CDQ分治】
  6. P2480-[SDOI2010]古代猪文【中国剩余定理,Lucas定理】
  7. jzoj3920-噪音【贪心,dp】
  8. ssl2863-石子合并【dp练习】
  9. 【Manacher】【贪心】字符串连接(金牌导航 Manacher-4)
  10. 【Splay】波动值之和(金牌导航 Splay-1)