java中重载 参数顺序_Java方法中的参数太多,第4部分:重载
java中重載 參數(shù)順序
期望將過(guò)多的參數(shù)傳遞給Java方法的問(wèn)題之一是,該方法的客戶端很難確定它們是否以適當(dāng)?shù)捻樞騻鬟f了適當(dāng)?shù)闹怠?在以前的文章中,我描述了如何使用自定義類(lèi)型 , 參數(shù)對(duì)象和構(gòu)建器來(lái)解決此問(wèn)題。 解決此問(wèn)題的另一種方法,也是本文的主題,是為客戶提供最適合他們需求的相同方法的重載版本 。 就像我以前關(guān)于過(guò)多的方法參數(shù)的文章一樣,我將在本篇文章的結(jié)尾簡(jiǎn)要討論這種方法的優(yōu)缺點(diǎn)。
Java支持方法重載 ,即能夠通過(guò)其方法簽名區(qū)分同一方法的不同版本。 請(qǐng)注意,作為兩種方法之間唯一的不同,不同的返回類(lèi)型通常不足以實(shí)現(xiàn)重載。
可能由于多種原因而應(yīng)用方法重載。 重載方法的一個(gè)目標(biāo)可能是在不同類(lèi)型上支持相同的功能(尤其是如果無(wú)法使用泛型來(lái)允許該方法支持不同類(lèi)型,或者如果在泛型可用之前編寫(xiě)了這些方法)。 考慮到此意圖的方法重載示例包括String.valueOf(boolean) , String.valueOf(char) , String.valueOf(double) , String.valueOf(long) , String.valueOf(Object)和其他一些版本String.valueOf重載在其他一些類(lèi)型上。
選擇重載方法的另一個(gè)原因是,客戶端可以調(diào)用方法的適當(dāng)版本以僅提供必要的參數(shù)。 例如,可以這樣做,以消除客戶端為不適用或可選的參數(shù)傳遞一個(gè)或多個(gè)null的需要。 為實(shí)現(xiàn)此目的而編寫(xiě)的重載方法的示例包括Date類(lèi)的構(gòu)造函數(shù),例如Date(int,int,int) , Date(int,int,int,int,int)和Date(int,int,int,int,int,int,int) ,int,int) 。
這種具有許多重載版本構(gòu)造器(每個(gè)構(gòu)造器都接受不同數(shù)量的參數(shù))的方法稱為伸縮構(gòu)造器,并已被某些人稱為反模式 。 實(shí)際上,這種伸縮式構(gòu)造方法的缺點(diǎn)是Josh Bloch著重于《 有效Java第二版》第2項(xiàng)中的Builder模式的推動(dòng)力之一。 順便說(shuō)一句, Date類(lèi)還提供了一些重載的構(gòu)造函數(shù),它們也旨在實(shí)現(xiàn)上述目標(biāo),例如,允許從String構(gòu)造Date 。
提供多個(gè)重載方法和構(gòu)造函數(shù)以接受一組減少的必需或最低適用參數(shù)的想法可以應(yīng)用于我們自己的類(lèi)。 下一個(gè)代碼清單為原始方法提供了太多的參數(shù),然后顯示了該方法的一些潛在的重載版本,這些版本接受減少的參數(shù)集。 為了便于討論,我們假設(shè)未在覆蓋的方法簽名之一中提供的任何參數(shù)是可選的,或不適用于該特定方法調(diào)用。 該代碼上的注釋說(shuō)明了每種方法如何做出某些假設(shè)以減少其參數(shù)數(shù)量。
方法過(guò)多和版本重載的參數(shù)示例
/*** Generates and provides an instance of the Person class. This method* expects all characteristics of the populated Person instance and so any* optional or not applicable characteristics must be passed in as null.* * @param lastName* @param firstName* @param middleName* @param salutation* @param suffix* @param streetAddress* @param city* @param state* @param isFemale* @param isEmployed* @param isHomeOwner* @return A Person object.*/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...}/*** Generate and provide an instance of the Person class that has only a first* and last name and address information. This method does not make any* assumptions about other characteristics of the instantiated Person, but* simply leaves those attributes undefined.* * @param lastName* @param firstName* @param streetAddress* @param city* @param state* @return Instance of Person class with no middle name and without specified* gender, employment status, or home ownership status.*/public Person createPerson(final String lastName,final String firstName,final String streetAddress,final String city,final String state){// implementation goes here...}/*** Generate and provide instance of Person class with no middle name and* with specified home ownership status. All instances of Person returned* from this method are assumed to be Female and to be Employed, but have no* address information.* * @param lastName* @param firstName* @param homeOwnerStatus* @return Instance of Person with provided first name, provided last name,* and provided home ownership status, and assumed to be an employed* female.*/public Person createPerson(final String lastName,final String firstName,final boolean homeOwnerStatus){// implementation goes here...}重載方法的Javadoc描述介紹了它們的不同方法。 第一種方法期望提供Person實(shí)例的所有特征,而對(duì)于不適用的參數(shù),則需要提供null(例如,如果一個(gè)人沒(méi)有中間名,或者該中間名對(duì)于在此中的使用不重要)案件)。 第二個(gè)重載版本不希望提供所有參數(shù),并假定它不希望的參數(shù)在返回的Person實(shí)例中仍未定義。
第三種重載方法版本大多是針對(duì)其特性未提供明確參數(shù)的假設(shè)。 例如,假設(shè)實(shí)例化的Person既是女性又是受雇人員。 第三種方法無(wú)法實(shí)例化男性或失業(yè)人員。 這說(shuō)明了通過(guò)簡(jiǎn)單的方法重載處理太多參數(shù)的缺點(diǎn)(僅根據(jù)參數(shù)的數(shù)量和類(lèi)型重載具有相同名稱的方法)。
我在這篇文章中沒(méi)有顯示我自己的任何構(gòu)造函數(shù),但是同樣的問(wèn)題和方法也適用于上面的非構(gòu)造函數(shù)方法。 同樣,重載的構(gòu)造函數(shù)與重載的非構(gòu)造函數(shù)方法具有相同的優(yōu)點(diǎn)和缺點(diǎn)。
優(yōu)勢(shì)與優(yōu)勢(shì)
Java中的方法重載似乎很容易理解,并且在包括C / C ++和C#在內(nèi)的多種語(yǔ)言中很常見(jiàn)。 當(dāng)參數(shù)是可選的時(shí),方法重載特別有效。 例如,在我的示例中,重載方法消除了傳遞中間名的期望,比重載方法假設(shè)特定實(shí)例是受雇女性要有效得多。 如果中間名,性別和就業(yè)狀況的特征確實(shí)是可選的,那么根本不假設(shè)任何一個(gè)值都比假定一個(gè)特定的值更好。
成本與劣勢(shì)
明智的方法重載可能很有用,但方法重載必須謹(jǐn)慎使用。 “ 學(xué)習(xí)Java語(yǔ)言”線索的“ 類(lèi)和對(duì)象”課程的“ 定義方法”部分警告:“應(yīng)謹(jǐn)慎使用重載的方法,因?yàn)樗鼈儠?huì)使代碼的可讀性大大降低。”
即使是我簡(jiǎn)單的三個(gè)示例,也顯示了如何使重載Swift變得難以閱讀。 在我的示例中,該代碼的閱讀者或用戶要么需要仔細(xì)閱讀Javadoc并相信它是最新且準(zhǔn)確的,要么需要深入研究實(shí)現(xiàn)以查看該方法的每個(gè)重載版本的功能。 在IDE中,尤其是如果同一方法有許多重載版本,則很難確定哪種方法適用于給定的情況。
我的示例表明,必須使用注釋來(lái)解釋重載方法所做的假設(shè)。 如前所述,如果開(kāi)發(fā)人員不費(fèi)心地編寫(xiě)它們,它們可能會(huì)過(guò)時(shí),不準(zhǔn)確甚至不可用。 能夠以不同的方式命名方法顯然更好,這樣方法的名稱可以提供有關(guān)其假設(shè)的線索,而不是僅依賴于Javadoc。 以這種方式使用命名方法將是以后的主題,但是根據(jù)定義為方法使用不同的名稱將使其不再重載。
我的示例顯示了使用帶有相同類(lèi)型的多個(gè)參數(shù)的重載(同名)方法的特定限制。 第三個(gè)示例接受一個(gè)boolean ,但是只有Javadoc和該參數(shù)的名稱可以告訴我它適用于房屋所有權(quán),而不適用于性別或就業(yè)狀況。 我無(wú)法提供類(lèi)似的重載方法來(lái)獲取相同的名稱信息和一個(gè)boolean ,該boolean表示不同的內(nèi)容(例如性別或工作狀態(tài)),因?yàn)樵摲椒ǖ暮灻cboolean指示房屋所有權(quán)狀態(tài)的方法相同。 再次可以通過(guò)使用不同命名的方法來(lái)補(bǔ)救,這些方法指出了它們適用于哪種布爾條件。
解決此最后提到的限制的另一種方法是使用自定義類(lèi)型和/或參數(shù)對(duì)象,并提供接受這些自定義類(lèi)型的不同組合的重載方法的各種版本。 這在下一個(gè)代碼清單中與自定義類(lèi)型一起顯示,該代碼顯示了對(duì)于這三種情況,當(dāng)這三種情況各自不需要共享相同的類(lèi)型時(shí),對(duì)于所有三種情況,可以通過(guò)單個(gè)第三個(gè)參數(shù)來(lái)重載接受兩個(gè)名稱字符串的方法。
自定義類(lèi)型啟用改進(jìn)的方法/構(gòu)造函數(shù)重載
public Person createPerson(final String lastName,final String firstName,final HomeownerStatus homeOwnership){// implementation goes here...}public Person createPerson(final String lastName,final String firstName,final Gender gender){// implementation goes here...}public Person createPerson(final String lastName,final String firstName,final EmploymentStatus employmentStatus){// implementation goes here...}我要提到的最后一個(gè)缺點(diǎn)與使用方法重載來(lái)解決與方法或構(gòu)造函數(shù)的參數(shù)過(guò)多相關(guān)的問(wèn)題有關(guān),這種方法將來(lái)可能導(dǎo)致大量的維護(hù)工作。 每當(dāng)添加或刪除或什至更改該類(lèi)的屬性(構(gòu)造函數(shù))或方法的參數(shù),甚至可能需要單獨(dú)檢查并可能更改多個(gè)構(gòu)造函數(shù)和/或方法。
結(jié)論
重載方法確實(shí)有其位置,并且可以是為客戶端提供更易理解和可讀的方法和構(gòu)造函數(shù)的便捷方法。 但是,我發(fā)現(xiàn)這種方法是“最佳”方法的頻率比已經(jīng)介紹的其他一些方法( 自定義類(lèi)型 , 參數(shù)對(duì)象 , 構(gòu)建器 )少,并且比我打算介紹的某些方法(例如不同的方法和相同方法和構(gòu)造函數(shù)的顯式命名版本)。 通過(guò)將方法重載與其他一些方法結(jié)合使用,可以減少方法重載方法的某些局限性和缺點(diǎn)。 例如,使用自定義類(lèi)型和參數(shù)對(duì)象可以顯著提高一個(gè)人的能力,使其能夠更狹窄地調(diào)整重載方法或構(gòu)造函數(shù)的各種版本以使其符合要求。
翻譯自: https://www.javacodegeeks.com/2013/10/too-many-parameters-in-java-methods-part-4-overloading.html
java中重載 參數(shù)順序
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java中重载 参数顺序_Java方法中的参数太多,第4部分:重载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux的diff原理(linux的d
- 下一篇: (手机翻墙安卓)