java方法传对象参数

在上一篇文章中 ,我研究了与方法和构造函数的长参数列表相关的一些问题。 在那篇文章中,我讨论了用自定义类型替换基元和内置类型以提高可读性和类型安全性。 这种方法使方法或构造函数的众多参数更具可读性,但并没有减少参数的数量。 在本文中,我将研究如何使用Parameter Object来减少方法或构造函数的参数数量。

通常,使“垃圾抽屉”对象耦合不相关的参数通常不是一个好主意,这些参数之间的唯一关系是它们需要传递给相同的方法或构造函数。 但是,当相关参数作为高度内聚的对象的一部分传递给构造函数或方法时,称为Introduce Parameter Object的重构是一个不错的解决方案。 重构的用法被描述为 “自然组合在一起的参数组”。 我将在这篇文章中演示这种重构。

为了演示Introduce Parameter Object重构的效用,让我们首先来看最后一篇文章中的示例,该示例在方法调用中使用了许多Stringboolean参数。

/*** Instantiate a Person object.* * @param lastName* @param firstName* @param middleName* @param salutation* @param suffix* @param streetAddress* @param city* @param state* @param isFemale* @param isEmployed* @param isHomeOwner* @return */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}

正如我在上一篇文章中所讨论的那样,这种方法对于调用者来说是乏味的,使得以错误的顺序传递参数变得非常容易,而类型安全性却很少,并且会降低代码的可读性。 幸运的是,此示例中的参数为应用Introduce Parameter Object重构提供了一些很好的机会。 “名称”参数(包括称呼和后缀)可以包含在单个全名类中。 地址参数(街道地址,城市和州)可以位于单个地址对象中。 其他参数可能不太容易分组为具有高内聚力的单个类。

使用“引入参数对象”重构的建议应用程序,由于减少了参数数量,因此前面显示的方法调用更加简单。 这显示在下一个代码清单中。

public Person createPerson(final FullName fullName,final Address address,final boolean isFemale,final boolean isEmployed,final boolean isHomeOwner){return new Person();}

上面的示例现在只有五个参数,并且更易读,并且更易于客户端使用。 从键入的角度来看,它也是更安全的,因为在这种情况下几乎不可能将名称字符串与地址字符串混淆。 不幸的是,这三个布尔参数仍然有点造成潜在的混乱和云可读性。 接下来的代码清单显示FullNameAddress类的潜在实现。

FullName.java(简单)

package dustin.examples;/*** Full name of a person.* * @author Dustin*/
public final class FullName
{private final String lastName;private final String firstName;private final String middleName;private final String salutation;private final String suffix;public FullName(final String newLastName,final String newFirstName,final String newMiddleName,final String newSalutation,final String newSuffix){this.lastName = newLastName;this.firstName = newFirstName;this.middleName = newMiddleName;this.salutation = newSalutation;this.suffix = newSuffix;}public String getLastName(){return this.lastName;}public String getFirstName(){return this.firstName;}public String getMiddleName(){return this.middleName;}public String getSalutation(){return this.salutation;}public String getSuffix(){return this.suffix;}@Overridepublic String toString(){return  this.salutation + " " + this.firstName + " " + this.middleName+ this.lastName + ", " + this.suffix;}
}

Address.java(简单)

package dustin.examples;/*** Representation of a United States address.* * @author Dustin*/
public final class Address
{private final String streetAddress;private final String city;private final String state;public Address(final String newStreetAddress, final String newCity, final String newState){this.streetAddress = newStreetAddress;this.city = newCity;this.state = newState;}public String getStreetAddress(){return this.streetAddress;}public String getCity(){return this.city;}public String getState(){return this.state;}@Overridepublic String toString(){return this.streetAddress + ", " + this.city + ", " + this.state;}
}

尽管代码得到了改进,但仍有一些问题可以改进。 特别是,具有太多参数的原始方法仍然具有三个boolean参数,可以很容易地将它们相互混淆。 尽管该方法的String参数被分解为两个新类,但这两个新类仍分别由一堆String组成。 在这些情况下,可能需要使用自定义类型来补充“ 介绍参数对象”重构。 使用我在上一篇文章中显示的自定义类型,带有太多参数的方法现在看起来像下一个代码清单中所示。

public Person createPerson(final FullName fullName,final Address address,final Gender gender,final EmploymentStatus employment,final HomeownerStatus homeownerStatus){// implementation goes here}

该方法现在具有较少的参数,并且确实具有不同类型的参数。 现在,IDE和Java编译器对于确保客户端正确使用此接口特别有用。 将自定义类型(写在上一篇文章中)应用于FullNameAddress类会导致这些类的下两个新代码清单。

FullName.java(自定义类型)

package dustin.examples;/*** Full name of a person.* * @author Dustin*/
public final class FullName
{private final Name lastName;private final Name firstName;private final Name middleName;private final Salutation salutation;private final Suffix suffix;public FullName(final Name newLastName,final Name newFirstName,final Name newMiddleName,final Salutation newSalutation,final Suffix newSuffix){this.lastName = newLastName;this.firstName = newFirstName;this.middleName = newMiddleName;this.salutation = newSalutation;this.suffix = newSuffix;}public Name getLastName(){return this.lastName;}public Name getFirstName(){return this.firstName;}public Name getMiddleName(){return this.middleName;}public Salutation getSalutation(){return this.salutation;}public Suffix getSuffix(){return this.suffix;}@Overridepublic String toString(){return  this.salutation + " " + this.firstName + " " + this.middleName+ this.lastName + ", " + this.suffix;}
}

Address.java(自定义类型)

package dustin.examples;/*** Representation of a United States address.* * @author Dustin*/
public final class Address
{private final StreetAddress streetAddress;private final City city;private final State state;public Address(final StreetAddress newStreetAddress, final City newCity, final State newState){this.streetAddress = newStreetAddress;this.city = newCity;this.state = newState;}public StreetAddress getStreetAddress(){return this.streetAddress;}public City getCity(){return this.city;}public State getState(){return this.state;}@Overridepublic String toString(){return this.streetAddress + ", " + this.city + ", " + this.state;}
}

到目前为止,我所有的示例都是独立的public类。 我经常发现,如果只需要一个参数对象来在同一包中的方法和构造函数之间传递信息,那么使这些参数对象类的package作用域很有用。 在某些情况下,嵌套类也可以用于这些参数对象。

优势与优势

参数对象最明显的好处是减少了传递给方法或构造函数的参数数量。 相关参数的这种封装使得更容易快速确定将哪些类型传递给方法或构造函数。 开发人员更容易理解较少的参数。

参数对象具有与自定义类型相同的优点之一:可以为方便功能向参数对象添加其他行为和特征。 例如,拥有一个Address类而不是一堆String类型可以使人们验证地址。

成本与劣势

参数对象的主要缺点是设计,实现和测试类需要一些额外的工作。 但是,这些工具非常容易编写和测试,而现代工具(如IDE和脚本语言)使这些任务中最平凡和繁琐的部分的自动化更加容易。 反对这种方法的一个更小的论点是它可以被滥用。 如果开发人员开始将不相关的参数捆绑到一个类中只是为了减少参数的数量,那并不一定会解决这种情况。 这种方法的确确实减少了参数的数量,但是没有实现提高可读性的最终目标,并且可以说这种方法的可读性更低。

结论

参数对象提供了一种很好的干净方法,可以适当地封装相关参数,以减少方法或构造函数的总参数数量。 它们易于实现,并且可以显着增强传递给方法和构造函数调用的可读性和类型安全性参数。 可以通过使用自定义类型进一步增强参数对象,如我之前的文章中所述。

参考: Java方法中的参数太多,第2部分:来自JCG合作伙伴 Dustin Marx的Inspired by Actual Events博客中的Parameters对象 。

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

java方法传对象参数

java方法传对象参数_Java方法中的参数太多,第2部分:参数对象相关推荐

  1. java方法的参数_Java方法参数

    Java方法参数 在程序设计语言中如何将参数传给方法(或函数): 按值调用:方法接受的是调用者提供的值 按引用调用:方法接受的是调用者提供的地址 Java程序设计语言总是采用按值调用(方法得到的是所有 ...

  2. java 方法体 out 参数_Java方法详解

    方法详解 1.方法的定义 Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序组合,包含于类或对象中:在程序中被创建,在其它地方被引用 设计方法的原则:要遵守原子性,即一个 ...

  3. java 默认参数_Java 方法的参数可以有默认值吗?

    Java 方法的参数可以有默认值吗? 例如 void method(String p1, int p2, bool p3=false); 回答 Java不支持这种特性, 如果你真的有需求,你可以 通过 ...

  4. java 遍历属性文件路径_Java项目中读取properties文件,以及六种获取路径的方法...

    Java读取properties文件的方法比较多,网上最多的文章是"Java读取properties文件的六种方法",但在Java应用中,最常用还是通过java.lang.Clas ...

  5. java线程休眠sleep函数_Java多线程中sleep()方法详解及面试题

    一. Java线程生命周期(五个阶段) 新建状态就绪状态运行状态阻塞状态死亡状态 如图 二.sleep方法 API中的解释 static voidsleep(long millis) 使当前正在执行的 ...

  6. java 方法的入口地址_Java 方法

    语法 访问修饰符 返回值类型 方法名(参数列表){ 方法体 } 如果方法的返回类型为 void ,则方法中不能使用 return 返回值. 方法也分为实例方法和类方法,加上关键字 static 的就是 ...

  7. python 获取参数模块_Python中获取启动程序时后面跟的参数的方法(optparse模块)【冰斌棒】...

    Python中获取启动程序时后面跟的参数的方法(optparse模块)[冰斌棒] 3年前 (2018-01-29)    作者:冰斌棒    分类:冰斌棒18程序计划    阅读次数:871 评论(0 ...

  8. java方法自己调用自己_java方法的定义与调用

    java的方法的定义方法(真拗口) //以下是java的方法 public void show() {     //public void的关键字  必须写 show是方法的名称,可以根据自己的需要定 ...

  9. java 自定义函数的调用_Java/Android中的函数调用回调函数自定义回调函数

    在做Android自定义控件时遇到要自定义回调函数的问题,想想自己还暂时没有那么精深的技术,赶紧返过头回来再重新研究Java中回调函数的问题.然而不幸的是,网上太多杂乱的帖子和博客都是转来转去,而且都 ...

最新文章

  1. win7操作系统在哪显示隐藏文件夹
  2. 浅析面包屑导航对网站SEO优化有哪些作用?
  3. linux c段错误,Linux C中段错误
  4. ImportError: No module named google.protobuf.internal
  5. 完全清除一个带包的项目文件的方法
  6. kubernetes 启动_如何启动和组织Kubernetes聚会
  7. vue 中的nextTick
  8. 运行hadoop指令之——WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform....
  9. 什么是IOC(控制反转)、DI(依赖注入)举个形象的例子通俗易懂
  10. HSRP冗余热备份协议
  11. 交通流理论学习(Introduciton)
  12. Taskctl是什么软件,有什么用?
  13. 正则表达式实现中文的大写字符
  14. 转载:凯明事件背后:TD的煎熬
  15. C++核心准则边译边学-I.4 接口类型应该精准且严格
  16. 战神网络 战神引擎 手游研究院 获取该区补丁失败 如何解决
  17. 深度学习自然语言处理模型实现大集合(精简版<100行)
  18. 基于C/C++的UTF-8转GBK,补充中文符号的乱码
  19. (三)棋盘覆盖问题(代码)
  20. 云数据存储创企Avere Systems获1400万美元E轮融资

热门文章

  1. JS中typeof的用法
  2. 汇编语言(十七)之判断三个数是否相等
  3. java.nio.ByteBuffer用法小结
  4. 响应式布局(手机端)
  5. 《走遍中国》珍藏版(三)
  6. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——OpSessionview实现
  7. sql serve基础
  8. EasyExcel(笔记)
  9. JDBC8.0 URL配置
  10. 韩文博 php,No releases available for package pear.php.net/HTTP_Upload