县总工会网站建设情况介绍,内容网站,中国建设银行官网站e路护航,同一网站相同form idjava自定义方法参数注解我认为构造函数和方法中冗长的参数列表是Java开发中的另一个“ 危险信号 ”#xff0c;就逻辑和功能而言#xff0c;它们不一定是“错误的”#xff0c;但通常暗示当前或将来出现错误的可能性很高。 在一小部分帖子中#xff0c;我介绍了一些可用于减… java自定义方法参数注解 我认为构造函数和方法中冗长的参数列表是Java开发中的另一个“ 危险信号 ”就逻辑和功能而言它们不一定是“错误的”但通常暗示当前或将来出现错误的可能性很高。 在一小部分帖子中我介绍了一些可用于减少方法或构造函数的参数数量或至少使冗长的参数列表更具可读性和错误率的方法。 每种方法都有其自己的优点和缺点。 这篇文章开始于该系列文章的开始重点是通过使用自定义类型来提高长方法/构造函数参数列表的可读性和安全性。 方法和构造函数的冗长参数列表有几个缺点。 大量参数可能很乏味并且难以调用代码使用。 较长的参数列表还可能导致调用中参数的无意切换。 在某些情况下可能很难找到这些错误。 幸运的是大多数方法不必处理冗长的参数列表的另一个缺点 JVM通过编译时错误 将参数的数量限制为一个方法 。 自定义类型的使用是一种不减少方法或构造函数的参数数量但确实使这些较长的参数列表更具可读性且不太可能以错误的顺序提供的方法。 这些自定义类型可以实现为数据传输对象 DTO JavaBeans 值对象 引用对象或任何其他自定义类型在Java中通常是类或枚举 。 这是一个人为设计的方法示例该方法接受多个参数其中许多参数为String类型许多参数为boolean类型。 /*** 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} 容易意外地切换它们并以错误的顺序传递它们。 尽管我通常希望减少参数但是可以通过更改参数列表中的类型来进行一些改进。 接下来的代码清单显示了这些自定义类型的一些示例这些示例可用于名称地址城市和布尔参数。 可以将三个name参数分别更改为Name的自定义类型而不是String 。 接下来定义该Name类型。 名称.java package dustin.examples;/*** Name representation.* * author Dustin*/
public final class Name
{private final String name;public Name(final String newName){this.name newName;}public String getName(){return this.name;}Overridepublic String toString(){return this.name;}
} 称呼和后缀String类型也可以替换为自定义类型如以下两个代码清单所示。 Salutation.java package dustin.examples;/*** Salutations for individuals names.* * author Dustin*/
public enum Salutation
{DR,MADAM,MISS,MR,MRS,MS,SIR
} 后缀.java package dustin.examples;/*** Suffix representation.* * author Dustin*/
public enum Suffix
{III,IV,JR,SR
} 其他参数也可以用自定义类型替换。 下一个代码清单显示了可以替换boolean以提高可读性的自定义枚举。 Gender.java package dustin.examples;/*** Gender representation.* * author Dustin*/
public enum Gender
{FEMALE,MALE
} EmploymentStatus.java package dustin.examples;/*** Representation of employment status.* * author Dustin*/
public enum EmploymentStatus
{EMPLOYED,NOT_EMPLOYED
} HomeOwnerStatus.java package dustin.examples;/*** Representation of homeowner status.* * author Dustin*/
public enum HomeownerStatus
{HOME_OWNER,RENTER
} 也可以使用定义的自定义类型来传递此人的地址信息如以下代码清单所示。 StreetAddress.java package dustin.examples;/*** Street Address representation.* * author Dustin*/
public final class StreetAddress
{private final String address;public StreetAddress(final String newStreetAddress){this.address newStreetAddress;}public String getAddress(){return this.address;}Overridepublic String toString(){return this.address;}
} City.java package dustin.examples;/*** City representation.* * author Dustin*/
public final class City
{private final String cityName;public City(final String newCityName){this.cityName newCityName;}public String getCityName(){return this.cityName;}Overridepublic String toString(){return this.cityName;}
} State.java package dustin.examples;/*** Simple representation of a state in the United States.* * author Dustin*/
public enum State
{AK,AL,AR,AZ,CA,CO,CT,DE,FL,GA,HI,IA,ID,IL,IN,KS,KY,LA,MA,MD,ME,MI,MN,MO,MS,MT,NC,ND,NE,NH,NJ,NM,NV,NY,OH,OK,OR,PA,RI,SC,SD,TN,TX,UT,VA,VT,WA,WI,WV,WY
} 通过实现这些自定义类型我们原始方法的签名变得更具可读性并且不太可能意外地以错误的顺序提供参数。 这显示在下一个代码清单中。 public Person createPerson(final Name lastName,final Name firstName,final Name middleName,final Salutation salutation,final Suffix suffix,final StreetAddress address,final City city,final State state,final Gender gender,final EmploymentStatus employment,final HomeownerStatus homeowner){// implementation goes here} 在上面的代码清单中编译器现在将通过不允许将之前的大多数String或boolean参数意外混合来帮助开发人员。 这三个名称仍然是一个潜在的问题因为调用方可能会无序提供它们但是如果我担心的话我可以为FirstName LastName和MiddleName编写特定的类型类。 相反我更喜欢使用一个代表全名的新类并将这三个名称全部用作其属性但是该方法将成为以后处理Java方法的过多参数的主题。 优势与优势 在给定方法上处理多个参数时编写和使用自定义类型的优点包括代码维护者和使用API的开发人员的可读性。 具有多个相同类型的参数不仅使开发人员可以轻松混合其顺序还降低了IDE在使用代码完成功能时将适当建议与参数匹配的能力。 正确的命名可以对IDE有所帮助但是对IDE而言没有什么比使用这些自定义类型可以完成的静态编译时检查有用的了。 总的来说我更喜欢从运行时转移尽可能多的自动检查到编译时并且让这些静态定义的自定义类型而不是泛型类型来完成此任务。 此外这些自定义类型的存在使将来更容易添加更多详细信息。 例如将来我可以在不更改接口的情况下将完整的状态名称或有关状态的其他详细信息添加到该枚举中。 我不可能用一个简单的String来表示状态。 成本与劣势 自定义类型方法最常被引用的缺点之一是额外的实例化和内存使用的开销。 例如 Name类需要实例化Name类本身及其封装的String 。 但是我认为这种争论通常是从过早优化的角度出发而不是合法的性能问题。 在某些情况下额外的实例化过于昂贵以至于无法证明增强的可读性和编译时检查但是许多也许大多数 情况可以提供额外的实例化而其可观察到的影响却可以忽略不计。 我很难相信使用自定义枚举而不是String或boolean会在大多数情况下引入性能问题。 使用自定义类型而不是内置类型的另一个缺点是编写和测试这些自定义类型需要额外的精力。 但是正如本文中的示例所示通常存在非常简单的类或枚举并且编写或测试也不难。 有了良好的IDE和良好的脚本语言例如Groovy它们特别容易自动编写和测试。 结论 我喜欢使用自定义类型来提高可读性并将更多的参数类型检查负担转移到编译器上。 我没有更多地使用这种方法来提高具有非常长的参数列表的方法和构造函数的可读性的最大原因是它本身并没有减少参数的数量。 它使长列表更易于阅读和使用但调用方仍然必须编写笨拙的客户端代码才能调用该方法或构造函数。 因此在改进接受一长串参数的方法时我经常使用除自定义类型之外的其他技术。 这些其他技术将在以后的文章中探讨。 参考 Java方法中的参数太多第1部分来自JCG合作伙伴 Dustin Marx的“ 实际事件的启发”博客中的自定义类型 。 翻译自: https://www.javacodegeeks.com/2013/10/too-many-parameters-in-java-methods-part-1-custom-types.htmljava自定义方法参数注解