参数|Java编程技巧:如何实现参数的输入输出?

 参数|Java编程技巧:如何实现参数的输入输出?
文章图片
阿里妹导读:Java没有直接的输入输出参数机制,无法简单地实现参数的输入输出功能,因此需要借助其它方法来实现。本文作者通过实践总结,分享利用方法参数、方法返回值、类字段等方法来实现参数的输入输出,并对比总结各自的优缺点及使用场景。较长,可收藏后再看。
文末福利:开发者训练营来了!
前言
软件开发方法学的泰斗肯特·贝克(Kent Beck)曾说过:
我不是一个伟大的程序员,我只是一个具有良好习惯的优秀程序员。
养成良好的习惯,尤其是不断重构的习惯,是每一个优秀程序员都应该具备的素质。重构(Refactoring)就是在不改变软件现有功能的基础上,通过调整程序的结构、提高程序的质量、优化程序的性能……使其程序的设计模式和架构更趋合理,从而提高软件的稳定性、扩展性和维护性。
一 一个需要重构的方法
需求描述:
需要把一个线串(一组经纬度坐标串),按照指定分段长度数组进行按比例划分(由于指定线串的长度较小,可以近似地认为在几何平面上,无需进行球面距离换算)。
代码实现:
备注说明:
在超过目标长度时,获取了一个中间坐标,由于数据精度的关系,这个坐标可能跟上一坐标或下一坐标重合。这里为了降低这块逻辑的复杂度,没有进行前后坐标的去重处理。
存在问题:
在方法splitLineString(划分线串)中,存在一个两层循环,导致了方法逻辑复杂、层级较深、代码量大。如果把外层循环体提炼为一个方法,就能够使代码更简洁、更清晰、更容易维护。
二 一次失败的重构经历
理论依据:
当看到一个方法定义过长或者这段方法需要很多注释才能让人理解的时候,这时候就要考虑是不是把这个方法的部分代码提取出来,形成一个新的方法,方便调用和理解,同时也减小方法的粒度。我们把这种方法叫做提炼函数(Extract Function),在Java语言中可叫做提炼方法(Extract Method)。
重构步骤:
创建一个新方法,并根据这个方法的意图来命名;
将待提炼的代码段从原方法中拷贝到新方法中;
检查提炼的代码段,把缺少的变量添加到方法的参数中;
如果部分参数成对出现,可以把这些参数合并为一个参数;
如果方法需要有返回值,确定返回值的类型,并在合适的位置返回;
在原方法中,删除被提炼的代码段,替换为新方法的调用。
代码实现:
存在问题:
粗看这段代码,似乎没有什么问题。但是,通过测试发现,并没有得到正确的结果。
分析原因:
在《Thinking in Java》中有这样一段话:
When you’re passing primitives into a method,you get a distinct copy of the primitive. When you’re passing a reference into a method, you get a copy of the reference.
当您将基本类型传递到方法中时,您将得到该基本类型的副本。当您将对象引用传递到方法中时,您将得到该对象引用的副本。
原来参数index(当前序号)和coordinate(当前坐标)在方法combineLineString(组装线串)中的修改,只是对该方法中的参数副本进行修改,并没有体现到调用方法splitLineString(划分线串)中,从而导致每次调用都在使用参数的初始化值。其实,这是在提取方法的过程中,没有考虑到参数的作用域。
【 参数|Java编程技巧:如何实现参数的输入输出?】检查技巧:
这里给出一个作者屡试不爽的检查技巧——把提取方法的所有参数添加上final关键字,编译后观察到哪个参数出现编译错误,就说明这个参数是一个输入输出参数(Inout Parameter)。
解决方案:
在Java语言中,没有直接的输入输出参数机制,无法简单地实现参数的输入输出功能。所以,需要借助其它解决方案,来实现参数的输入输出功能。在这里,作者通过实践总结,给出了以下几种解决方案。
三 利用方法参数实现
本章将从方法参数入手,实现参数的输入输出功能。
3.1 利用参数类实现
理论依据:
引入参数对象(Introduce Parameter Object):当一个方法的参数超过3个时,就可以考虑将参数封装成一个对象类。将参数封装成对象类后,提高了代码的可读性,并且该参数对象类也可以重用。以后,如果增加或删除参数,方法本身不需要修改,只需要修改参数对象类就可以了。
这里,可以利用引入参数对象重构方法,定义一个输入输出参数类,来实现参数的输入输出功能。
代码实现:
3.2 利用单值数组实现
理论依据:
当您将对象引用传递到方法中时,您将得到该对象引用的副本。也就是说,当您将数组引用传递到方法中时,您将得到该数组引用的副本。但是,这两个数组引用都指向同一个数组,当修改副本数组引用中的值时,也能体现到原有数组引用中。
利用数组引用的这个特性,可以实现参数的输入输出功能。这里,引入了单值数组的概念,即一个数组只有一个值,用于传递输入输出参数值。
代码实现:
3.3 利用元组类实现
理论依据:


推荐阅读