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

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

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

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

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

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

相关文章

Artifact到底是什么

将项目构建成一个可以在服务器部署的文件包(如:war 包或者 exploded 的文件包),或者构建成的 jar 包(这些 jar 包通常是某些模块程序文件,也可以是某些插件程序文件),这些都叫 Artif…

python win10 桌面_Python3如何实现Win10桌面自动切换

得空写了个自动切换桌面背景图片的小程序。再不写python就要扔键盘了,对vue还有那么一点好感,天天php真是有够烦。准备工作准备个文件夹放在桌面上,平时看到什么高清好图就拽进去。运行脚本脚本如下:#!/usr/bin/pythonimport ctyp…

java中抽象类继承抽象类_用Java中的抽象类扩展抽象类

java中抽象类继承抽象类示例问题 当我创建Java :: Geci抽象类AbstractFieldsGenerator和AbstractFilteredFieldsGenerator我遇到了一个不太复杂的设计问题。 我想强调一下,这个问题和设计对于某些人来说似乎很明显,但是在我最近与一位初级开发人员&#…

pb90代码如何连接sql2008r2_如何使用 HTTP Headers 来保护你的 Web 应用

众所周知,无论是简单的小网页还是复杂的单页应用,Web 应用都是网络攻击的目标。2016 年,这种最主要的攻击模式 —— 攻击 web 应用,造成了大约 40% 的数据泄露。事实上,现在来说,了解网络安全并不是锦上添花…

Servlet配置初始化参数/配置参数

文章目录给某个Servlet配置初始化参数配置全局的参数ServletConfig给某个Servlet配置初始化参数 也可以通过注解的方式来配置初始化参数: 在 Servlet 中获取针对 Servlet 的参数值: String version getInitParameter("version");配置全局的…

poi动态创建文档_POI创建的文档具有不同条件的灵活样式

poi动态创建文档介绍 这篇文章解释了基于各种标准将样式应用于文档的困难并提供了解决方案。 Java编程中的常见任务之一是根据存储在数据库中的数据创建Excel报告。 在这些情况下,Java程序员使用POI :-)。 这些报告通常对样式和数据格式有严格的规定。 数据通常是SQ…

python编码程序_python 编码

网页的编码方式是简体中文gb2312 (查看网页源码,可以看到),而python内部的编码方式为unicode,之前的代码是这样的:contentAll urllib.urlopen(urlLink).read()soup BeautifulSoup.BeautifulSoup(contentAll) #生成BeautifulSou…

比特(bit)_二进制数

二进制数位,也叫比特位,其实就是指位置,是指二进制数的位置。例如,0101 这是二进制数,而且是 4 位的二进制数,因为有 4 个位置,每个位置放一个二进制数,确切的说是每个位置放一个二进…

javax线程池超时结束_没有Javax的Jakarta EE:这次世界也不会结束

javax线程池超时结束如果您错过了新闻, Oracle将向Eclipse基金会捐赠Java EE规范 。 这个决定是在规范过程中进行了相当长时间的Hibernate之后,人们理所当然地怀疑Oracle丧失了对Java EE的战略兴趣。 首先,Java EE和更广泛的Java社区很好地满…

Final Cut Pro X如何去视频水印/视频去水印

先剪辑好视频(比如把不要的段切掉),然后选中视频,把它复制一份到另一个轨道(按住option键,用鼠标左键拖放即可复制)点击右下角的 效果(Effect)→ 模糊(Blur)→ 高斯模糊(Gaussian),把高斯模糊拖入上边那条轨道再次选择效果(Effect…

为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...

我还记得大学实习面试时,被问到什么是线程池这个问题,因为这个题我被录取了,原因就是我背出来了,而另外一个面试的没背出来,说实话当时还真不知道它是干什么的,就是看面试题给背下来了,在之后就…

java中两任务并行运行_Java并行编程中的“可调用”与“可运行”任务

java中两任务并行运行当我们用Java编写多线程应用程序时,我们倾向于使用“ Runnable ”接口来实现线程类。 您的类必须简单地实现此接口并覆盖run方法。 对于琐碎的用例,我们可以通过调用“ start”方法直接启动线程,结果将控制流委托给run…

Servlet中的监听器

文章目录什么是监听器如何写监听器配置监听器统计在线人数的案例什么是监听器 Servlet 规范当中定义的一种特殊的类,作用是监听容器当中产生的一些事件并进行相应的处理。 容器产生的事件指的是两大类事件: 第一大类 生命周期相关的事件,指…

python调用百度接口实现ocr识别_Python调用百度OCR实现图片文字识别的示例代码

百度AI提供了一天50000次的免费文字识别额度,可以愉快的免费使用!下面直接上方法:首先在百度AI创建一个应用,按照下图创建即可,创建后会获得如下:创建后会获得如下信息:APP_ID ******API_KEY …

selenium 替代品_每个人都在谈论Selenium替代品-明智地选择!

selenium 替代品什么是Selenium? Selenium是一套Web浏览器自动化工具,用于跨多种平台实现浏览器自动化。 尽管Selenium工具具有更多功能,但出于测试原因,它们仍被用来自动化Web应用程序。 Jason Huggins于2004年创建了Selenium&am…

Maven构建Artifact时,不会创建空目录

Maven 构建的 Web 项目中,你在 Web Resource Directories(默认名称是webapp)下创建的空目录,在构建Artifact 时,并不会在构件中也创建该空目录。 下图所示的四个空目录 upload,在构建 Artifact 时都不会创…

通用数据保护条例_欧盟《通用数据保护条例》——2019年的形势

“自欧盟《通用数据保护条例》(GDPR)生效以来,很多公司企业都忙于实行全新的数据保护标准。一个完善的数据保护管理系统比以往任何时候都要重要。我们可以参考一下其他公司在GDPR方面的一些初步经验。”自2018年5月25日GDPR生效以来,它在某些情况下引发了…

【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推荐--…

caffeine 缓存_使用Caffeine和Spring Boot的多个缓存配置

caffeine 缓存缓存是几乎所有应用程序性能的关键。 有时需要分布式缓存 ,但并非总是如此。 在许多情况下,本地缓存可以很好地工作,并且不需要分布式缓存的开销和复杂性。 因此,在许多应用程序中,包括普通的Spring和Sp…

File类的学习

文章目录简介常量常用方法代码示例简介 java.io.File 是文件和目录的路径名的抽象表示形式,主要用于文件和目录的创建、查找和删除等操作 常量 public static final char separatorChar // 这个常量保存系统默认的文件名分隔符,以字符形式保存 public…