java方法传对象参数_Java方法中的参数太多,第2部分:参数对象
java方法傳對象參數
在上一篇文章中 ,我研究了與方法和構造函數的長參數列表相關的一些問題。 在那篇文章中,我討論了用自定義類型替換基元和內置類型以提高可讀性和類型安全性。 這種方法使方法或構造函數的眾多參數更具可讀性,但并沒有減少參數的數量。 在本文中,我將研究如何使用Parameter Object來減少方法或構造函數的參數數量。
通常,使“垃圾抽屜”對象耦合不相關的參數通常不是一個好主意,這些參數之間的唯一關系是它們需要傳遞給相同的方法或構造函數。 但是,當相關參數作為高度內聚的對象的一部分傳遞給構造函數或方法時,稱為Introduce Parameter Object的重構是一個不錯的解決方案。 重構的用法被描述為 “自然組合在一起的參數組”。 我將在這篇文章中演示這種重構。
為了演示Introduce Parameter Object重構的效用,讓我們首先來看最后一篇文章中的示例,該示例在方法調用中使用了許多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}正如我在上一篇文章中所討論的那樣,這種方法對于調用者來說是乏味的,使得以錯誤的順序傳遞參數變得非常容易,而類型安全性卻很少,并且會降低代碼的可讀性。 幸運的是,此示例中的參數為應用Introduce Parameter Object重構提供了一些很好的機會。 “名稱”參數(包括稱呼和后綴)可以包含在單個全名類中。 地址參數(街道地址,城市和州)可以位于單個地址對象中。 其他參數可能不太容易分組為具有高內聚力的單個類。
使用“引入參數對象”重構的建議應用程序,由于減少了參數數量,因此前面顯示的方法調用更加簡單。 這顯示在下一個代碼清單中。
public Person createPerson(final FullName fullName,final Address address,final boolean isFemale,final boolean isEmployed,final boolean isHomeOwner){return new Person();}上面的示例現在只有五個參數,并且更易讀,并且更易于客戶端使用。 從鍵入的角度來看,它也是更安全的,因為在這種情況下幾乎不可能將名稱字符串與地址字符串混淆。 不幸的是,這三個布爾參數仍然有點造成潛在的混亂和云可讀性。 接下來的代碼清單顯示FullName和Address類的潛在實現。
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編譯器對于確保客戶端正確使用此接口特別有用。 將自定義類型(寫在上一篇文章中)應用于FullName和Address類會導致這些類的下兩個新代碼清單。
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和腳本語言)使這些任務中最平凡和繁瑣的部分的自動化更加容易。 反對這種方法的一個更小的論點是它可以被濫用。 如果開發人員開始將不相關的參數捆綁到一個類中只是為了減少參數的數量,那并不一定會解決這種情況。 這種方法的確確實減少了參數的數量,但是沒有實現提高可讀性的最終目標,并且可以說這種方法的可讀性更低。
結論
參數對象提供了一種很好的干凈方法,可以適當地封裝相關參數,以減少方法或構造函數的總參數數量。 它們易于實現,并且可以顯著增強傳遞給方法和構造函數調用的可讀性和類型安全性參數。 可以通過使用自定義類型進一步增強參數對象,如我之前的文章中所述。
翻譯自: https://www.javacodegeeks.com/2013/10/too-many-parameters-in-java-methods-part-2-parameters-object.html
java方法傳對象參數
總結
以上是生活随笔為你收集整理的java方法传对象参数_Java方法中的参数太多,第2部分:参数对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java SE 11(18.9)中的AP
- 下一篇: java与java ee_CapeDwa