java中重载 参数顺序_Java方法中的参数太多,第4部分:重载

java中重载 参数顺序

期望将过多的参数传递给Java方法的问题之一是,该方法的客户端很难确定它们是否以适当的顺序传递了适当的值。 在以前的文章中,我描述了如何使用自定义类型 , 参数对象和构建器来解决此问题。 解决此问题的另一种方法,也是本文的主题,是为客户提供最适合他们需求的相同方法的重载版本 。 就像我以前关于过多的方法参数的文章一样,我将在本篇文章的结尾简要讨论这种方法的优缺点。

Java支持方法重载 ,即能够通过其方法签名区分同一方法的不同版本。 请注意,作为两种方法之间唯一的不同,不同的返回类型通常不足以实现重载。

可能由于多种原因而应用方法重载。 重载方法的一个目标可能是在不同类型上支持相同的功能(尤其是如果无法使用泛型来允许该方法支持不同类型,或者如果在泛型可用之前编写了这些方法)。 考虑到此意图的方法重载示例包括String.valueOf(boolean) , String.valueOf(char) , String.valueOf(double) , String.valueOf(long) , String.valueOf(Object)和其他一些版本String.valueOf重载在其他一些类型上。

选择重载方法的另一个原因是,客户端可以调用方法的适当版本以仅提供必要的参数。 例如,可以这样做,以消除客户端为不适用或可选的参数传递一个或多个null的需要。 为实现此目的而编写的重载方法的示例包括Date类的构造函数,例如Date(int,int,int) , Date(int,int,int,int,int)和Date(int,int,int,int,int,int,int) ,int,int) 。

这种具有许多重载版本构造器(每个构造器都接受不同数量的参数)的方法称为伸缩构造器,并已被某些人称为反模式 。 实际上,这种伸缩式构造方法的缺点是Josh Bloch着重于《 有效Java第二版》第2项中的Builder模式的推动力之一。 顺便说一句, Date类还提供了一些重载的构造函数,它们也旨在实现上述目标,例如,允许从String构造Date 。

提供多个重载方法和构造函数以接受一组减少的必需或最低适用参数的想法可以应用于我们自己的类。 下一个代码清单为原始方法提供了太多的参数,然后显示了该方法的一些潜在的重载版本,这些版本接受减少的参数集。 为了便于讨论,我们假设未在覆盖的方法签名之一中提供的任何参数是可选的,或不适用于该特定方法调用。 该代码上的注释说明了每种方法如何做出某些假设以减少其参数数量。

方法过多和版本重载的参数示例

/*** Generates and provides an instance of the Person class. This method* expects all characteristics of the populated Person instance and so any* optional or not applicable characteristics must be passed in as null.* * @param lastName* @param firstName* @param middleName* @param salutation* @param suffix* @param streetAddress* @param city* @param state* @param isFemale* @param isEmployed* @param isHomeOwner* @return A Person object.*/public Person createPerson(final String lastName,final String firstName,final String middleName,final String salutation,final String suffix,final String streetAddress,final String city,final String state,final boolean isFemale,final boolean isEmployed,final boolean isHomeOwner){// implementation goes here...}/*** Generate and provide an instance of the Person class that has only a first* and last name and address information. This method does not make any* assumptions about other characteristics of the instantiated Person, but* simply leaves those attributes undefined.* * @param lastName* @param firstName* @param streetAddress* @param city* @param state* @return Instance of Person class with no middle name and without specified*    gender, employment status, or home ownership status.*/public Person createPerson(final String lastName,final String firstName,final String streetAddress,final String city,final String state){// implementation goes here...}/*** Generate and provide instance of Person class with no middle name and* with specified home ownership status. All instances of Person returned* from this method are assumed to be Female and to be Employed, but have no* address information.* * @param lastName* @param firstName* @param homeOwnerStatus* @return Instance of Person with provided first name, provided last name,*    and provided home ownership status, and assumed to be an employed*    female.*/public Person createPerson(final String lastName,final String firstName,final boolean homeOwnerStatus){// implementation goes here...}

重载方法的Javadoc描述介绍了它们的不同方法。 第一种方法期望提供Person实例的所有特征,而对于不适用的参数,则需要提供null(例如,如果一个人没有中间名,或者该中间名对于在此中的使用不重要)案件)。 第二个重载版本不希望提供所有参数,并假定它不希望的参数在返回的Person实例中仍未定义。

第三种重载方法版本大多是针对其特性未提供明确参数的假设。 例如,假设实例化的Person既是女性又是受雇人员。 第三种方法无法实例化男性或失业人员。 这说明了通过简单的方法重载处理太多参数的缺点(仅根据参数的数量和类型重载具有相同名称的方法)。

我在这篇文章中没有显示我自己的任何构造函数,但是同样的问题和方法也适用于上面的非构造函数方法。 同样,重载的构造函数与重载的非构造函数方法具有相同的优点和缺点。

优势与优势

Java中的方法重载似乎很容易理解,并且在包括C / C ++和C#在内的多种语言中很常见。 当参数是可选的时,方法重载特别有效。 例如,在我的示例中,重载方法消除了传递中间名的期望,比重载方法假设特定实例是受雇女性要有效得多。 如果中间名,性别和就业状况的特征确实是可选的,那么根本不假设任何一个值都比假定一个特定的值更好。

成本与劣势

明智的方法重载可能很有用,但方法重载必须谨慎使用。 “ 学习Java语言”线索的“ 类和对象”课程的“ 定义方法”部分警告:“应谨慎使用重载的方法,因为它们会使代码的可读性大大降低。”

即使是我简单的三个示例,也显示了如何使重载Swift变得难以阅读。 在我的示例中,该代码的阅读者或用户要么需要仔细阅读Javadoc并相信它是最新且准确的,要么需要深入研究实现以查看该方法的每个重载版本的功能。 在IDE中,尤其是如果同一方法有许多重载版本,则很难确定哪种方法适用于给定的情况。

我的示例表明,必须使用注释来解释重载方法所做的假设。 如前所述,如果开发人员不费心地编写它们,它们可能会过时,不准确甚至不可用。 能够以不同的方式命名方法显然更好,这样方法的名称可以提供有关其假设的线索,而不是仅依赖于Javadoc。 以这种方式使用命名方法将是以后的主题,但是根据定义为方法使用不同的名称将使其不再重载。

我的示例显示了使用带有相同类型的多个参数的重载(同名)方法的特定限制。 第三个示例接受一个boolean ,但是只有Javadoc和该参数的名称可以告诉我它适用于房屋所有权,而不适用于性别或就业状况。 我无法提供类似的重载方法来获取相同的名称信息和一个boolean ,该boolean表示不同的内容(例如性别或工作状态),因为该方法的签名与boolean指示房屋所有权状态的方法相同。 再次可以通过使用不同命名的方法来补救,这些方法指出了它们适用于哪种布尔条件。

解决此最后提到的限制的另一种方法是使用自定义类型和/或参数对象,并提供接受这些自定义类型的不同组合的重载方法的各种版本。 这在下一个代码清单中与自定义类型一起显示,该代码显示了对于这三种情况,当这三种情况各自不需要共享相同的类型时,对于所有三种情况,可以通过单个第三个参数来重载接受两个名称字符串的方法。

自定义类型启用改进的方法/构造函数重载

public Person createPerson(final String lastName,final String firstName,final HomeownerStatus homeOwnership){// implementation goes here...}public Person createPerson(final String lastName,final String firstName,final Gender gender){// implementation goes here...}public Person createPerson(final String lastName,final String firstName,final EmploymentStatus employmentStatus){// implementation goes here...}

我要提到的最后一个缺点与使用方法重载来解决与方法或构造函数的参数过多相关的问题有关,这种方法将来可能导致大量的维护工作。 每当添加或删除或什至更改该类的属性(构造函数)或方法的参数,甚至可能需要单独检查并可能更改多个构造函数和/或方法。

结论

重载方法确实有其位置,并且可以是为客户端提供更易理解和可读的方法和构造函数的便捷方法。 但是,我发现这种方法是“最佳”方法的频率比已经介绍的其他一些方法( 自定义类型 , 参数对象 , 构建器 )少,并且比我打算介绍的某些方法(例如不同的方法和相同方法和构造函数的显式命名版本)。 通过将方法重载与其他一些方法结合使用,可以减少方法重载方法的某些局限性和缺点。 例如,使用自定义类型和参数对象可以显着提高一个人的能力,使其能够更狭窄地调整重载方法或构造函数的各种版本以使其符合要求。

参考: 《 Java方法中的参数太多》,第4部分:来自JCG合作伙伴 Dustin Marx的重载,来自Inspired by Actual Events博客。

翻译自: https://www.javacodegeeks.com/2013/10/too-many-parameters-in-java-methods-part-4-overloading.html

java中重载 参数顺序

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

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

相关文章

c语言金箍棒答案,《西游记》阅读测试题(带答案)

《西游记》测试题(后附答案)姓名得分1.《如来佛辨识假猴王》故事中,那只假孙悟空是什么猴子变的?()A.金丝猴 B.石猴 C.六耳猕猴2.金角大王和银角大王原来是()的弟子。A.太上老君 B.孙悟空 C.观音菩萨3.蜘蛛…

五个金念什么_四个“金”字读什么?

展开全部读音为:jīn ,是金字的异体字写法,读音和意思与金字完全相同,打不62616964757a686964616fe58685e5aeb931333431353265出来,如下图:金拼音:jīn释义:1.俗称金子。金属元素&am…

Istio的零停机滚动更新

本系列文章的第一部分介绍了如何在Kubernetes集群中实现真正的零停机时间更新。 我们专门解决了将流量从旧实例切换到新实例时出现的请求失败。 本文将展示如何使用Istio群集实现相同的目标。 服务网格技术(例如Istio)通常与容器编排结合使用。 Istio以…

聚类dbi指数_一种基于DBI-PD聚类算法的异常检测机制

一种基于DBI-PD聚类算法的异常检测机制丁姝郁【期刊名称】《电脑开发与应用》【年(卷),期】2015(000)002【摘要】分析了网络数据维数和检测准确度之间的关系,介绍了常用于入侵检测的聚类分析方法及其优缺点。在此基础上,提出一种以戴维森堡丁指数(DBI)为…

单片机红外通信c语言,基于C语言的计算机与多单片机红外无线串口通信的实现.doc...

基于C语言的计算机与多单片机红外无线串口通信的实现基于C语言的计算机与多单片机红外无线串口通信的实现黄文亮 信息学院 电子信息工程专业指导教师 刘传菊摘要:计算机与一台或多台单片机的通信系统中的数据通讯一般采用的是串行通信方式。串行通信可采用有线与无线…

android 设置资源,Android 资源

Android 资源Android Resources02/01/2018本文内容本文介绍了 Xamarin 中 Android 资源的概念,并介绍了如何使用这些资源。其中介绍了如何使用 Android 应用程序中的资源来支持应用程序本地化和多个设备,包括不同的屏幕大小和密度。This article introdu…

zbrush常用笔刷_ZBrush中常用笔刷综合简介

单击左托盘的笔刷图标,弹出一个笔刷库,其中有许多常用笔刷,这也是许多初学者所头疼的问题,ZBrush的笔刷非常多,而且功能很强大,好多朋友不知道该选择哪一个笔刷进行雕刻。其实,在ZBrush的学习中…

spring java配置_Spring:使基于Java的配置更加优雅

spring java配置大家好,我很久没有写新文章了。 积累了很多资料,需要在不久的将来在我的博客中发布。 但是现在我想谈谈Spring MVC应用程序配置。 确切地说,我想谈谈基于Java的Spring配置。 尽管在3.0版本中引入了基于Spring java的配置&…

android封装oauth2,Android AccountAuthenticator和OAuth2

这肯定是可行的。来自Android AccountManager文档:Many servers support some notion of an authentication token, which canbe used to authenticate a request to the server without sending theusers actual password. (Auth tokens are normally created with…

php redis 队列抢红包_php+redis实现消息队列

消息队列:是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它应…

使用Spring Security在Spring Boot中进行缓存

在这篇文章中,我想分享一下O&B的一个团队的经验教训。 他们正在使用带有Spring Security的Spring Boot。 默认情况下,Spring Security保护的所有内容都将通过以下HTTP标头发送到浏览器: Cache-Control: no-cache, no-store, max…

wifi定位算法android,WIFI定位算法

网络定位指通过周边wifi列表、基站列表、IP地址等信息确定用户位置的过程。 我们采集的训练数据是每个GPS坐标位置和对应的Wifi和基站列表。 其中每个Wifi和基站有唯一的Mac地址作为ID和信号强度。有三种定位方法:均值法首先估计一个wifi的中心点位置,可…

仿小黄车android定位,小黄车ofo是怎么实现自行车定位功能的?

摩拜单车通过车身携带的GPS而实现单车定位,但是我们知道ofo是没有安装GPS,它又是如何实现单车定位的呢?我居住的地方距离地铁站步行大约15分钟左右,距离最近的商场步行将近30分钟,距离周边的便利店,水果店,饭店等步行1…

python苹果下载软件助手哪个好_Mac上有什么实用的必备软件?

Mac上的一些软件真的超好用,比如...每天依据时间变化的壁纸,看清晨、看夕阳我是 Super叔 ,关注了就是好朋友,这里说明下还是,软件只是工具,初衷是为了方便自己提高效率,别为了去模仿所谓某某软件可以怎么怎么复杂的,用得多么炫酷好用,而去花非常多精力为…

hibernate 刷新_Hibernate事实:了解刷新操作顺序很重要

hibernate 刷新Hibernate将开发人员的思维方式从思考SQL转变为思考对象状态转换。 根据Hibernate Docs,实体可能处于以下状态之一: new / transient:实体不与持久性上下文相关联,因为它是数据库不知道的新创建的对象。 持久性&a…

android变量要不要附空值,android-如何在使用Parcelable时序列化空值

我见过的大多数序列化代码都使用两个标志来指示值的存在/不存在,或者在值前加上一个计数字段(例如,在编写数组时),如果该值不等于,则计数字段仅设置为零。 根本不存在。检查Android核心类的源代码会发现以下代码(来自Message类)&a…

gprs连接中断记录_请收好!脉搏波血压计连接天天血压APP使用指南

总有那么几个粗心的小伙伴丢失了说明书,在后台追问波哥如何连接“天天血压”,于是给大家安排了这篇使用指南。首先我们来了解下“天天血压”的功能:1.通过蓝牙或GPRS传输,同步记录每次测量结果;2. 血压趋势分析&#x…

使用Spring Boot,JHipster和React构建照片库PWA

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 从本质上讲,React只是一个UI工具包,即ala GWT,但是…

html5画布funcition,2020前端基础知识学习第一节(示例代码)

一、选择题1. 浏览器端的存储技术有哪些()A.cookie  B.localStorage  C.session  D.userData答案:A B D分析:cookie通常用于存储用户等登录信息,能够存储的数据是有限的,而且在指定域名下所有的请求都会带上。localStoage是…

names文件和data文件_data.table让你的读取速度提升百倍

不知道大家有没有用read.table和read.csv读取过文件,当文件不大的时候你可能还感觉不出读取速度,但是当文件比较大的时候,比如有上万行的时候,你就会感觉到等待时间明显变长,甚至无法忍受。今天小编给大家安利一个实用…