日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java.函数参数太多,Java方法参数太多怎么办—Part 2—引入参数对象,javapart

發布時間:2025/4/5 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java.函数参数太多,Java方法参数太多怎么办—Part 2—引入参数对象,javapart 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java方法參數太多怎么辦—Part 2—引入參數對象,javapart

目錄

自定義類型

引入參數對象

本文是這個系列的第二篇文章,介紹了通過引入參數對象應對參數過多的問題。如果你也希望參與類似的系列文章翻譯,可以加入我們的Android開發 和 技術翻譯 小組。

在前一篇文章中,我關注了一些關于構造函數或方法參數過多的問題。文中我討論了用自定義類型代替基本、內置類型以獲得良好的可讀性和安全性。然而這并不能減少參數的數量。這次,我將用參數對象方法給構造函數和方法的參數“瘦身”。

通常你會看到一組特定參數,它們關系緊密并且總是一起傳給方法或構造函數,有可能好幾個函數都使用這一組參數。這些函數可能屬于同一個類,也可能屬于不同的類。

這時,《重構》這本書中介紹的“引入參數對象”的方法能很好地解決問題。該方法可以描述為運用一個對象封裝這些參數,再以該對象取代他們。本文就是要演示這一“重構”。

為演示好“引入參數對象”這一重構方法,我們首先看下上篇文章曾使用過的代碼示例。

/**

* 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

}

前面說過,這種傳統方法對調用者來說非常乏味。不但因為沒有類型安全保證導致傳參時容易搞混,而且代碼可讀性也不是很理想。幸運的是,可以通過“引入參數對象”方法重構示例代碼。“names”型參數能合并寫進一個“FullName”類,同理”address”型參數也一樣。其他剩余參數因為相互聯系不那么緊密沒法合并到一個新的類中。

在引入參數對象重構后參數數量減少了,方法調用相比以前也變得更加簡單。這將在下面的代碼中得以體現。

public Person createPerson(

final FullName fullName,

final Address address,

final boolean isFemale,

final boolean isEmployed,

final boolean isHomeOwner)

{

return new Person();

}

上面的示例中只有5個參數,這意味著可讀性更強和調用也更方便。從類型角度看也更為安全,因為不會將名字和地址類型的字符串混淆。遺憾的是,三個布爾型參數依然存在這種隱患。下面代碼展示了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;

}

@Override

public 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;

}

@Override

public String toString()

{

return this.streetAddress + ", " + this.city + ", " + this.state;

}

}

盡管代碼得到了改進,仍然有一些問題有待結局。尤其是原來的方法參數包含了3個布爾類型,彼此之間很容易混淆。盡管字符串類型參數被重構到了兩個新類,但是這兩個類中還是包含了很多的字符串。這種情況就需要為引入的參數對象用自定義類型重構。使用上篇中展示的自定義類型,重構以后的參數如下面代碼所示:

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;

}

@Override

public 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;

}

@Override

public String toString()

{

return this.streetAddress + ", " + this.city + ", " + this.state;

}

}

現在,所有的示例都使用了獨立的公共類。如果參數對象類位于同一個包的作用域中,就能將參數對象用于方法和構造函數之間傳遞信息,即使只能達成這一點也是非常有用的。另外在一些情況下,嵌套類也能當參數對象使用。

引入參數對象的好處與優點

最明顯好處在于參數對象減少了構造函數或方法的傳參數量。相關的參數一起封裝更容易確定傳遞給構造函數和方法的是什么類型的參數。參數數量減少帶給開發者的好處是顯而易見的。

參數對象跟上篇文章討論過的自定義類型有一個相同的好處:可以方便地為參數對象添加額外的行為和特征。 如用一個Address類來驗證地址信息,而不是使用一堆字符串。

引入參數對象的代價與缺點

參數對象的主要缺點是需要額外的工作來設計、實現和測試相關類。但是,如果我們借助IDE和腳本語言,其中大量繁瑣的步驟都能自動完成。當然,關于參數對象還有一個更小的爭論:參數對象可能被濫用。如果一個開發者純粹為了減少參數數量,把聯系不緊的幾個參數強捆在一個類中這肯定是行不通的,在可讀性上甚至適得其反。

總結

參數對象通過恰當封裝聯系緊密的參數來減少方法和構造函數的參數數量。它們易于實現,能顯著提高方法和構造函數在參數傳遞時的可讀性和安全性。正如我上篇文章所說,參數對象如果結合自定義類型等一起使用效果會更好。

原文鏈接: dzone 翻譯: Wld5.com - 韓遠青

譯文鏈接: http://www.wld5.com/6600.html

[ 轉載請保留原文出處、譯者和譯文鏈接。]

總結

以上是生活随笔為你收集整理的java.函数参数太多,Java方法参数太多怎么办—Part 2—引入参数对象,javapart的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天操天天干天天爽 | 少妇福利视频 | 国产二区精品视频 | 四虎网址大全 | 国产成人精品999在线观看 | 国产字幕侵犯亲女 | 亚洲女同一区 | 伊人五月天 | 极品三级 | 18黄暴禁片在线观看 | 国产免费一区二区三区最新不卡 | 国产精品夜色一区二区三区 | 久久无码性爱视频 | 欧美做受 | 日本丰满bbwbbw厨房 | 狠狠爱综合网 | 青青草视频免费播放 | 欧美成人免费观看视频 | 欧美伦理一区二区三区 | 欧美男人天堂网 | 亚洲日本视频在线观看 | 日韩欧美国产成人 | 欧美另类第一页 | 亚洲国产视频一区二区 | 亚洲色图欧美色 | 播放黄色一级片 | 上原亚衣av一区二区三区 | 成人黄色激情网 | 嫩草视频在线 | 免费av地址 | 国产偷怕 | 老牛影视av牛牛影视av | 日本欧美国产 | 亚洲精品日韩丝袜精品 | 亚洲综合图片一区 | 国产精品日韩一区二区 | 久久久久久久久久久久久久久久久久 | 久久久久免费精品视频 | 国产乱淫片视频 | 毛片基地在线观看 | 可以免费看的av毛片 | 国产男同gay网站 | 成人18视频免费69 | 肉丝超薄少妇一区二区三区 | 亚洲第一网址 | 白丝少妇| 欧美视频一二三 | 两个小y头稚嫩紧窄h文 | 久久久国产精品视频 | 手机在线永久免费观看av片 | 三级自拍视频 | 国产第一页在线 | 欧美日韩精品区别 | 极品尤物一区二区 | 精品国产一区二区三区久久久久久 | 国产在线观看黄 | 亚洲h视频在线观看 | 一级a毛片免费观看久久精品 | 午夜视频在线看 | 巨大胸大乳奶电影 | 一区二区三区 欧美 | 日韩中文字幕免费 | 国产女人在线观看 | 国产精品久久网站 | 中文字幕精品一区二区精品 | 豆花在线视频 | 无人码人妻一区二区三区免费 | 男女激情在线观看 | 亚洲精品国产精品乱码在线观看 | 欧美日韩第一区 | 成人亚洲综合 | 国产盗摄一区二区三区 | 深夜av在线| 无限资源日本好片 | 亚洲私人影院 | 国产精品日韩欧美一区二区三区 | 中文在线播放 | 国产91丝袜在线18 | 九九在线观看视频 | 亚洲在线免费看 | 自拍视频网址 | 国产免费无码一区二区 | 公交上高潮的丁芷晴 | 天堂综合| 欧美黄在线观看 | 三级中文字幕 | 女人高潮潮呻吟喷水 | 中国吞精videos露脸 | 国产日韩欧美精品一区 | 亚洲一区 | 波多野吉衣在线视频 | wwwav在线 | 国产超碰人人爽人人做人人爱 | 中文有码一区 | v天堂在线 | 日韩中文字幕免费在线观看 | 日日插插| 日韩美女中文字幕 | 欧美日韩一区二区三区在线 |