显式无参数构造函数与默认构造函数

大多数不熟悉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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 有线网络管理,uos linux网络管理

实验-修该网卡默认命名规则vim /etc/default/grubGRUB_CMDLINE_LINUX"net.ifnames0 biosdevname0"update-grubshutdown -r now实验-临时配置IP地址ifconfigifconfig ens33 192.168.200.201/24ifconfig实验-IP地址的配置systemctl restart NetworkManagernmcli connec…

【渝粤教育】 国家开放大学2020年春季 1009离散数学(本) 参考试题

试卷代号:1018 2 0 2 0年春季学期期末统一考试 国际公法 试题 2020年7月 一、单项选择题(每题1分,共10分,每题只有一项答案正确,请将正确答案的序号填在括号内) 1.国际法基本原则的特征之一是各国公认&…

什么是网络光纤收发器?

网络光纤收发器,将网络中的连接介质换为光纤。光纤的低损耗、高抗电磁干扰性,在使网络传输距离从200米扩展到2公里至几十公里,乃至于上百公里的同时,也使数据通讯质量有了较大的提高。它使服务器、中继器、集线器、终端机与终端机…

【渝粤教育】 国家开放大学2020年春季 1020国际私法 参考试题

试卷代号:1025 2 0 2 0年春季学期期末统一考试 保险学概论 试题 2020年7月 注 意 事 项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人…

linux hexdump显示格式c数组,hexdump命令

hexdump命令一般用来查看“二进制”文件的十六进制编码,但实际上它能查看任何文件,而不只限于二进制文件。语法hexdump [选项] [文件]...选项-n length 只格式化输入文件的前length个字节。-C 输出规范的十六进制和ASCII码。-b 单字节八进制显示。-c 单字…

【渝粤教育】 国家开放大学2020年春季 1032成本管理 参考试题

试卷代号:1040 2 0 2 0年春季学期期末统一考试 公司概论 试题 2020年7月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人收完…

关于光纤收发器的一些基本常识介绍

光纤收发器是网络数据传输中必不可缺少的一种设备,那么,什么是光纤收发器呢,光纤收发器都有什么组成的呢,光纤收发器是怎么分类的呢,光纤收发器有哪些特点呢,光纤收发器在数据传播过程中起到什么作用呢&…

【渝粤教育】 国家开放大学2020年春季 1050金融理论前沿课题 参考试题

试卷代号:1058 2 0 2 0年春季学期期末统一考试 商法试题 2020年7月 一、单项选择题(每题只有一个正确答案,多选或错选均不得分,每小题1分,共10分) 1.商人应具备的基本条件是( )。 A.…

【渝粤教育】 国家开放大学2020年春季 1068小企业管理 参考试题

试卷代号:1070 2 0 2 0年春季学期期末统一考试 组织行为学 试题 2020年7月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人收…

linux操作系统学什么,Linux学习-第一天-什么是操作系统

Linux学习--第一天--什么是操作系统?第一章 什么是Linux1.1 什么是Linux1.1.1 计算机:计算的辅助工具计算机必须要有的组件:输入单元:如鼠标、键盘、卡片阅读器机,等等。中央处理器(CPU):含有算术逻辑、控制…

java中runnable_Java:在Runnable中处理RuntimeException

java中runnable去年年底,我正在运行预定的任务来监视Neo4j集群,而我遇到的问题之一是有时会退出监视。 最终我意识到这是因为RuntimeException被抛出到Runnable方法中,而我没有处理它。 以下代码演示了该问题: import java.util…

工业级光纤收发器产品性能特点介绍

工业级光纤收发器是一种可以延长传输距离的一种工业交换机,它具有便捷、维护简单、抗干扰性能强、性能强大、运行稳定等优点,产品设计符合以太网标准,性能稳定可靠。那么在,数据通信行业中,工业级光纤收发器到底扮演者…

【渝粤教育】 国家开放大学2020年春季 1079高等代数专题研究 参考试题

试卷代号:1083 座位号 2 0 2 0年春季学期期末统一考试 几何基础 试题 2020年7月 一、选择题(每小题4分,本题共20分) 1.如果两个向量的对应分量成比例,则二者( ). A.平行 B&#xff0…

【渝粤教育】 国家开放大学2020年春季 1107传感器与测试技术 参考试题

试卷代号:1110 座位号 2 0 2 0年春季学期期末统一考试 工程地质 试题 2020年7月 一、单项选择题(将正确答案的序号填入括号,每小题2分,共计30分) 1.工程地质条件即( )。 A.工程活动的地质环境 B…

工业级光纤收发器如何正确使用和维护?

工业级光纤收发器在越来越多的场景中运用,如何正确的使用和维护是延长工业级光纤收发器寿命的重要手段。那么,如何正确使用及维护光纤收发器呢?接下来飞畅科技的小编就给大家简单梳理一下!一起来看看吧! 1、在使用中要…

imx6的Linux默认颜色,MY-IMX6 Linux-3.14 测试手册(1)

明远智睿MY-IMX6 Linux-3.14 测试手册1 测试前的准备请按照《Linux快速启动手册》中的“Linux快速启动” -> “连接设备”进行连接。请按照《Linux快速启动手册》中的“Linux快速启动” -> “启动设备”进行启动。2 测试项目2.1 网口测试MY-IMX6-EK200支持两个百兆网口。…

JavaFX的科幻用户界面第1部分

使用JavaFX创建的Sci-Fi UI成形窗口 虚构的UI可以变成现实吗? 成长于80年代的小时候,我看到了自己的科幻电影,这确实激发了我对图形用户界面(GUI)的热爱,尤其是试图使科幻UI在现实世界中成为可能的想法。 …

【渝粤教育】 国家开放大学2020年春季 1129土木工程力学(本) 参考试题

试卷代号:1132 2 0 2 0年春季学期期末统一考试 卫生管理 试题 2020年7月 一、单选题(每题2分,共30分) 1.在进行卫生人力预测时,下列考虑了居民对卫生服务的利用程度的方法是( )。 A.卫生需要法 …

c语言程序设计21点扑克牌,C语言程序设计-21点扑克牌游戏.pdf

实验报告课程名称 : C语言程序设计实验项目 : 21点扑克牌游戏设计专业班级 : 电子信息工程实验室号 : 信息 205 实验组号 : xx实验时间 : 2010-5-4 批阅时间 :指导教师 : 成 绩 &…

【渝粤教育】 国家开放大学2020年春季 1167环境水利学 参考试题

试卷代号:1174 2 0 2 0年春季学期期末统一考试 水工钢筋混凝土结构(本) 试题 2020年7月 一、选择题(每小题2分,共20分) 在所列备选项中,选1项正确的或最好的作为答案,将选项号填入各…