java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回

java方法带参数返回值

在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , 方法重载和方法命名 )。 鉴于此,对于本系列中的一篇文章,我专门讨论Java方法如何提供返回值似乎让我感到惊讶。 但是,方法的返回值会影响开发人员选择通过设置或更改提供的参数(而不是附加或添加更传统的方法返回机制)来提供“返回”值时方法所接受的参数。

非构造方法返回值的“传统方式”都可以在方法签名中指定。 从Java方法返回值的最常见的方法是通过其声明的return type 。 这通常效果很好,但是最常见的一种挫败是允许它仅从 Java方法返回一个值 。

Java的异常处理机制也是将方法的“结果”保留给调用方的另一种方法。 特别是, 经过检查的异常通过throws子句通告给调用者。 实际上, Jim Waldo在他的《 Java:The Good Parts》一书中指出,当人们将Java异常视为另一种方法返回限制为Throwable类型时,更容易理解Java异常。

尽管方法的返回类型和抛出的异常旨在作为方法将信息返回给调用方的主要方法,但有时仍倾向于通过传递给方法的参数来返回数据或状态。 当一个方法需要返回多个信息时,Java方法的单值返回似乎是有限的。 尽管例外提供了另一种与呼叫者进行通信的方式,但似乎几乎所有人都同意,例外应仅用于报告异常情况,而不能用于报告“正常”数据或在控制流中使用。 鉴于只能从一个方法返回一个对象或原语,并且异常仅允许返回Throwable且应仅将其用于报告异常情况,因此Java开发人员劫持参数作为返回数据的替代途径变得越来越有吸引力给来电者。

开发人员可以用来将方法参数用作返回数据的载体的技术是接受可变的参数并改变传入对象的状态。 这些可变对象可以通过方法更改其内容,然后调用者可以访问它提供的对象以确定已被调用方法应用的新状态设置。 尽管可以使用任何可变对象来完成此操作,但对于试图通过参数将值传递回调用方的开发人员而言,集合似乎特别有吸引力。

通过提供的参数将状态传递回被调用有一些缺点。 由于大多数Java开发人员可能期望参数传入而不是传出(并且Java不提供任何代码支持来指定差异),因此这种方法通常违反了使您惊讶的原则 。 鲍勃·马丁(Bob Martin)在他的《 清洁代码 》一书中这样写道 :“通常,应避免使用输出参数。” 使用参数作为方法向调用者提供状态或输出的方法的另一个缺点是,这会增加传递给方法的参数的混乱程度。 考虑到这一点,本文的其余部分重点介绍通过传入的参数返回多个值的替代方法。

尽管Java方法只能返回单个对象或基元,但是当人们认为一个对象可以是我们想要的任何对象时,这实际上并不是什么限制。 我见过几种方法,但不推荐使用。 其中之一是返回对象实例的数组或集合,而每个Object都是一个完全不同且通常不相关的“事物”。 例如,该方法可能返回三个值作为数组或集合的三个元素。 此方法的一种变体是使用一对元组或n大小的元组返回多个关联值。 此方法的另一个变体是返回Java Map,该Java Map将任意键映射到它们的关联值。 与其他解决方案一样,此方法会给客户端带来不必要的负担,让他们知道那些键是什么,并通过这些键访问映射值。

下一个代码清单包含几种不那么吸引人的方法,这些方法用于返回多个值而不会劫持方法参数以返回多个值。

通过通用数据结构返回多个值

// ===============================================================// NOTE: These examples are intended solely to illustrate a point//       and are NOT recommended for production code.// ===============================================================/*** Provide movie information.* * @return Movie information in form of an array where details are mapped to* elements with the following indexes in the array:*       0 : Movie Title*       1 : Year Released*       2 : Director*       3 : Rating*/public Object[] getMovieInformation(){final Object[] movieDetails ={"World War Z", 2013, "Marc Forster", "PG-13"};return movieDetails;}/*** Provide movie information.* * @return Movie information in form of a List where details are provided* in this order: Movie Title, Year Released, Director, Rating.*/public List<Object> getMovieDetails(){return Arrays.<Object>asList("Ender's Game", 2013, "Gavin Hood", "PG-13");}/*** Provide movie information.* * @return Movie information in Map form. Characteristics of the movie can* be acquired by looking in the map for these key elements: "Title", "Year",* "Director", and "Rating"./*/public Map<String, Object> getMovieDetailsMap(){final HashMap<String, Object> map = new HashMap();map.put("Title", "Despicable Me 2");map.put("Year", 2013);map.put("Director", "Pierre Coffin and Chris Renaud");map.put("Rating", "PG");return map;}

上面显示的方法确实满足了不通过调用的方法的参数将数据传递回调用方的意图,但是在调用方上仍然没有不必要的负担来了解返回数据结构的详细信息。 减少方法的参数数量并且不违反最小惊喜原则是很好的,但是要求客户知道复杂数据结构的复杂性并不是很好。

当我需要返回多个值时,我更喜欢为返回值编写自定义对象。 与使用数组,集合或元组结构相比,这需要做更多的工作,但是很少的额外工作(对于现代Java IDE,通常只有几分钟的时间)会带来可读性和流利性,而这是这些更通用的方法所不具备的。 我的自定义返回对象不必在Javadoc上进行解释或要求我的代码的用户仔细阅读我的代码,以了解在数组或集合中按哪个顺序提供了哪些参数,或者在元组中以哪个值提供了这些参数,而无需为我的自定义返回对象定义方法他们告诉客户确切他们提供什么。

接下来的代码片段说明了一个主要由NetBeans生成的简单Movie类,该类可以用作返回类型,并且可以返回该类的实例的代码,而不是更通用,更不易理解的数据结构。

电影.java

package dustin.examples;import java.util.Objects;/*** Simple Movie class to demonstrate how easy it is to provide multiple values* in a single Java method return and provide readability to the client.* * @author Dustin*/
public class Movie
{private final String movieTitle;private final int yearReleased;private final String movieDirectorName;private final String movieRating;public Movie(String movieTitle, int yearReleased, String movieDirectorName, String movieRating){this.movieTitle = movieTitle;this.yearReleased = yearReleased;this.movieDirectorName = movieDirectorName;this.movieRating = movieRating;}public String getMovieTitle(){return movieTitle;}public int getYearReleased(){return yearReleased;}public String getMovieDirectorName(){return movieDirectorName;}public String getMovieRating(){return movieRating;}@Overridepublic int hashCode(){int hash = 3;hash = 89 * hash + Objects.hashCode(this.movieTitle);hash = 89 * hash + this.yearReleased;hash = 89 * hash + Objects.hashCode(this.movieDirectorName);hash = 89 * hash + Objects.hashCode(this.movieRating);return hash;}@Overridepublic boolean equals(Object obj){if (obj == null){return false;}if (getClass() != obj.getClass()){return false;}final Movie other = (Movie) obj;if (!Objects.equals(this.movieTitle, other.movieTitle)){return false;}if (this.yearReleased != other.yearReleased){return false;}if (!Objects.equals(this.movieDirectorName, other.movieDirectorName)){return false;}if (!Objects.equals(this.movieRating, other.movieRating)){return false;}return true;}@Overridepublic String toString(){return "Movie{" + "movieTitle=" + movieTitle + ", yearReleased=" + yearReleased + ", movieDirectorName=" + movieDirectorName + ", movieRating=" + movieRating + '}';}
}

在单个对象中返回多个详细信息

/*** Provide movie information.* * @return Movie information.*/public Movie getMovieInfo(){return new Movie("Oblivion", 2013, "Joseph Kosinski", "PG-13");}

Movie课的简单写作花了我大约5分钟的时间。 我使用NetBeans类创建向导来选择类名称和包,然后键入该类的四个属性。 从那里开始,我仅使用NetBeans的“插入代码”机制来插入“获取”访问器方法以及重写的toString() , hashCode()和equals(Object)方法。 如果我认为不需要这些,可以简化类,但按原样创建确实很容易。 现在,我有一个更有用的返回类型,这由使用该类的代码反映出来。 它几乎不需要在返回类型上使用Javadoc注释,因为该类型可以说明一切,并使用“ get”方法发布其内容。 我认为,与通过方法参数返回状态或使用更通用且更难使用的返回数据结构之类的替代方法相比,创建这些简单的类以返回多个值的少量额外工作将获得丰厚的回报。

保留要返回给调用方的多个值的自定义类型是一种有吸引力的解决方案,这并不奇怪。 毕竟,从概念上讲,这与我之前写过的关于使用自定义类型和参数对象传递多个相关参数而不是单独传递它们的概念非常相似。 Java是一种面向对象的语言,当我没有看到Java代码中使用对象来组织好参数并在一个不错的包中返回值时,它使我感到惊讶。

优势与优势

使用自定义参数对象表示和封装多个返回值的优点是显而易见的。 方法的参数可以保留为“输入”参数,因为所有输出信息(通过异常机制传达的错误信息除外)都可以在方法返回的自定义对象中提供。 与使用通用数组,集合,映射,元组或其他通用数据结构相比,这是一种更清洁的方法,因为所有这些替代方法都将开发工作转移到了所有潜在客户上。

成本与劣势

我看到编写具有多个值的自定义类型用作Java方法的返回类型的缺点很小。 也许最常声称的成本是编写和测试这些类的价格,但是该成本非常小,因为这些类往往很简单,并且因为现代IDE为我们完成了大部分工作。 因为IDE是自动执行的,所以代码通常是正确的。 这些类非常简单,以使代码审阅者易于阅读,并且易于测试。

为了寻找其他成本和缺点,人们可能会争辩说这些类可以膨胀代码库和程序包,但我认为这不是一个强有力的论据。 尽管自定义类实现不好的风险很小,但我认为客户机代码可能会混淆更通用的返回类型的解释。 另一个小风险是,开发人员可能将很多无关的东西扔到同一个类中,而这些项目之间的唯一关系是,相同的方法需要返回它们。 即使这样,我能看到的唯一更好的选择是修改代码,而无需返回多个值。 在自定义对象中返回原本不相关的项似乎仍然比在通用数据结构中返回这组不相关的数据更好。 实际上,这些通用数据结构变得更加笨拙并且难以使用,因为它们所拥有的值变得越来越不相关。

结论

自定义类型和参数对象可帮助我们直接解决Java方法中过多参数的问题。 幸运的是,这些自定义类型和返回值对象还可以帮助我们通过自定义类型和返回值对象返回多个值,而不需要添加仅用于将输出信息传递回去的附加参数,从而间接地减少所需参数的数量。呼叫者,召集者。

参考: Java方法中的参数太多,第6部分: JCG合作伙伴 Dustin Marx在Inspired by Actual Events博客上的方法返回 。

翻译自: https://www.javacodegeeks.com/2013/11/too-many-parameters-in-java-methods-part-6-method-returns.html

java方法带参数返回值

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

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

相关文章

java足球游戏毕业设计,java毕业设计_springboot框架的校园足球管理平台

今天介绍一个java毕设题目, 题目内容为springboot框架的校园足球管理平台, 是一个采用b/s结构的javaweb项目, 采用java语言编写开发工具eclipse, 项目框架jspspringbootmybatis, 校园足球管理平台的信息存储于mysql中, 并基于mybatis进行了orm封装, 该校园足球管理平台系统通过…

python 爬取贝壳网小区名称_用Python爬取贝壳网新房和二手房数据

[Python] 纯文本查看 复制代码import randomimport requestsfrom bs4 import BeautifulSoupimport reimport mathfrom lxml import etreeUSER_AGENTS ["Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)&q…

Java 11功能– Java飞行记录器

在本文中&#xff0c;我们将看到如何利用Java Flight Recorder功能作为Java 11的一部分。之前&#xff0c;它是商业功能之一。 但是&#xff0c;对于带有JEP 328的 Java 11&#xff0c;它是开源的。 Java Flight Recorder将OS和JVM事件记录到一个文件中&#xff0c;可以使用Jav…

MATLAB slider中的数值,在微信小程序中如何使用slider设置数据值

这篇文章主要介绍了微信小程序使用slider设置数据值及switch开关组件功能,结合实例形式分析了slider组件及switch组件的功能与使用方法,并附带源码供读者下载参考,需要的朋友可以参考下本文实例讲述了微信小程序使用slider设置数据值及switch开关组件功能。分享给大家供大家参考…

qstandarditemmodel 重写data函数后无法实现拖拽_实现类似百度网盘上传的功能

今天写到了上传文件部分&#xff0c;记录一下。前端使用了dropzone.js(用于实现文件上传的JS库)&#xff0c;并对此文件进行了细微修改。说一下思路吧&#xff1a;首先界面长这样&#xff1a;点击上传文件&#xff0c;需要弹出一个对话框&#xff0c;对话框中有支持拖拽文件的文…

逻辑斯蒂回归_逻辑斯蒂回归详细解析 | 统计学习方法学习笔记 | 数据分析 | 机器学习...

本文包括&#xff1a;重要概念逻辑斯蒂回归和线性回归二项逻辑斯谛回归模型逻辑斯蒂回顾与几率模型参数估计多项逻辑斯谛回归其它有关数据分析&#xff0c;机器学习的文章及社群1.重要概念&#xff1a;在正式介绍逻辑斯蒂回归模型之前&#xff0c;需要先对一些基本概念有所了解…

mysql 数据传输 定时,MySQL数据库定时备份的实现方法

1. 创建shell脚本2. 给shell脚本添加执行权限3. 给脚本添加定时任务crontab文件的说明&#xff1a;用户创建的crontab文件中&#xff0c;每一行都代表一项定时任务&#xff0c;每行的每个字段代表一项设置&#xff0c;它的格式每行共分为六个字段&#xff0c;前五段是时间设定字…

python 生意_本周互联网关注(2015515):劳动人民的生意经、python好还是go好

我很喜欢写这种类型的文章&#xff0c;写的也轻松&#xff0c;大家看的也多。性价比高。那么现在继续。一、所谓光辉岁月&#xff0c;不是波澜壮阔的时候&#xff0c;而是无人问津时&#xff0c;你对梦想的坚持。| 陈欧很多人刚开始创业时激情无比高涨&#xff0c;干着干着开始…

mysql空洞数据,Mysql 表空间和 数据页空洞

一、表空间1、表空间&#xff1a; innodb 引擎存储的最高层&#xff1b; 存放所有的数据2、独立表空间&#xff1a;Mysql 版本5.6 后默认开启的单表单空间(1)Innodb 默认存储引擎页的大小为 16K &#xff1b;默认表空间 大小为96k(2)独立表空间 开启方式 innodb_file_per_table…

junit 5测试异常处理_在JUnit中处理异常的3种方式。 选择哪一个?

junit 5测试异常处理在JUnit中&#xff0c;有3种流行的方式来处理测试代码中的异常&#xff1a; 试捕习语 使用JUnit规则 带注解 我们应该使用哪一个&#xff1f;何时使用&#xff1f; 试捕习语 这个习语是最受欢迎的习语之一&#xff0c;因为它已在JUnit 3中使用。 Test…

python网站数据写入mysql_python网络爬虫抓取动态网页并将数据存入数据库MySQL

简述以下的代码是使用python实现的网络爬虫&#xff0c;抓取动态网页 http://hb.qq.com/baoliao/ 。此网页中的最新、精华下面的内容是由JavaScript动态生成的。审查网页元素与网页源码是不同。以上是网页源码以上是审查网页元素所以此处不能简单的使用正则表达式来获取内容。以…

交通流预测 | Matlab基于KNN-BiLSTM的交通流预测(对比SVR、LSTM、GRU、KNN-LSTM)

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 交通流预测 | Matlab基于KNN-BiLSTM的交通流预测&#xff08;对比SVR、LSTM、GRU、KNN-LSTM&#xff09; 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复Matlab基于KNN-BiLSTM的交通流预测&#xff08;对…

JMetro“ Metro”选项卡,Java的TreeView和ContextMenu(JavaFX)

我刚刚发布了JMetro的新更新&#xff0c;将版本升级到3.3.0。 在此更新中&#xff0c;您将找到&#xff1a; 新的TreeView Fluent设计系统&#xff08;Metro&#xff09;启发风格&#xff1b; 新的Tabs和TabPane FDS启发风格&#xff1b; 新的上下文菜单采用深色FDS启发的样…

蒙特卡罗计算积分matlab,matlab下二重积分的蒙特卡洛算法

%%monte_carlo_ff.m%被积函数(二重)function ffmonte_carlo_ff(x,y)ffx*y^2;%函数定义处end%%monte_carlo.m%蒙特卡洛计算二重积分function resultmonte_carlo(a,b,c,d,n,m)%先y后x积分&#xff0c;a是x积分下限&#xff0c;b是x积分上限&#xff0c;c是y积分下限&#xff0c;d…

数据挖掘原理与算法_技术分享|大数据挖掘算法之FPGrowth算法

程一舰数据技术处我们常说我们生活在信息时代&#xff0c;实际上&#xff0c;我们更多的还是生活在数据时代。因为从过去到现在累积了大量的数据&#xff0c;对数据的挖掘和分析也仅是从最近几年大数据和人工智能技术的发展而兴起。我们对现有数据价值的利用还远低于数据本身拥…

centos 程序 mysql数据库文件位置,CentOS 更改MySQL数据库目录位置

引言&#xff1a;由于MySQL的数据库太大&#xff0c;默认安装的/var盘已经再也无法容纳新增加的数据&#xff0c;没有办法&#xff0c;只能想办法转移数据的目录。下面我简单整理一下这几天把MySQL从/var/lib/mysql目录下面转移到/home/mysql_data/mysql下面具体操作1、首先我们…

neo4j数据浏览器_Neo4j:在Neo4j浏览器的帮助下探索新数据集

neo4j数据浏览器在查看新的Neo4j数据库时&#xff0c;我发现遇到的一件困难就是确定其中包含的数据的结构。 我习惯于关系数据库&#xff0c;在该数据库中您可以轻松获取表列表和外键&#xff0c;以便您将它们相互连接。 传统上&#xff0c;使用Neo4j时很难做到这一点&#x…

mfc中怎么集成文件_怎么把几个pdf合并并打印在一份文件中?

a为什么我们要把pdf文件合并呢&#xff1f;当然我们要知道什么是pdf文件才能进行更多的操作&#xff0c;Pdf是我们许多人都会用到的一种存储文件的格式&#xff0c;它的内容基本是以图像的形式表现&#xff0c;所以我们在播放和打印的时候可以不用担心出现格式错乱的问题。PDF格…

php中日期选择代码,实现JS日期时间选择器

这次给大家带来实现JS日期时间选择器&#xff0c;实现JS日期时间选择器的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。flatpickr 是一个轻量级、注重精益、由 UX 驱动和可扩展的 JavaScript 日期时间选择器。下载 演示 GitHubflatpickr 不依赖于任何…

Jib –为Spring Boot应用程序构建docker映像

使用Jib为示例Spring Boot应用程序创建docker映像是如此容易&#xff0c;这让我感到惊喜。 让我首先将Jib与以前使用的方法进行对比。 我正在使用bmuschko出色的gradle-docker插件创建docker映像。 如果可以访问docker守护程序以及基于dockerfile或直接Dockerfile的gradle ds…