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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回

發(fā)布時(shí)間:2023/12/3 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java方法帶參數(shù)返回值

在當(dāng)前的系列文章中,我正在致力于減少調(diào)用Java方法和構(gòu)造函數(shù)所需的參數(shù)數(shù)量,到目前為止,我一直專注于直接影響參數(shù)本身的方法( 自定義類(lèi)型 , 參數(shù)對(duì)象 , 構(gòu)建器模式 , 方法重載和方法命名 )。 鑒于此,對(duì)于本系列中的一篇文章,我專門(mén)討論Java方法如何提供返回值似乎讓我感到驚訝。 但是,方法的返回值會(huì)影響開(kāi)發(fā)人員選擇通過(guò)設(shè)置或更改提供的參數(shù)(而不是附加或添加更傳統(tǒng)的方法返回機(jī)制)來(lái)提供“返回”值時(shí)方法所接受的參數(shù)。

非構(gòu)造方法返回值的“傳統(tǒng)方式”都可以在方法簽名中指定。 從Java方法返回值的最常見(jiàn)的方法是通過(guò)其聲明的return type 。 這通常效果很好,但是最常見(jiàn)的一種挫敗是允許它僅從 Java方法返回一個(gè)值 。

Java的異常處理機(jī)制也是將方法的“結(jié)果”保留給調(diào)用方的另一種方法。 特別是, 經(jīng)過(guò)檢查的異常通過(guò)throws子句通告給調(diào)用者。 實(shí)際上, Jim Waldo在他的《 Java:The Good Parts》一書(shū)中指出,當(dāng)人們將Java異常視為另一種方法返回限制為T(mén)hrowable類(lèi)型時(shí),更容易理解Java異常。

盡管方法的返回類(lèi)型和拋出的異常旨在作為方法將信息返回給調(diào)用方的主要方法,但有時(shí)仍傾向于通過(guò)傳遞給方法的參數(shù)來(lái)返回?cái)?shù)據(jù)或狀態(tài)。 當(dāng)一個(gè)方法需要返回多個(gè)信息時(shí),Java方法的單值返回似乎是有限的。 盡管例外提供了另一種與呼叫者進(jìn)行通信的方式,但似乎幾乎所有人都同意,例外應(yīng)僅用于報(bào)告異常情況,而不能用于報(bào)告“正常”數(shù)據(jù)或在控制流中使用。 鑒于只能從一個(gè)方法返回一個(gè)對(duì)象或原語(yǔ),并且異常僅允許返回Throwable且應(yīng)僅將其用于報(bào)告異常情況,因此Java開(kāi)發(fā)人員劫持參數(shù)作為返回?cái)?shù)據(jù)的替代途徑變得越來(lái)越有吸引力給來(lái)電者。

開(kāi)發(fā)人員可以用來(lái)將方法參數(shù)用作返回?cái)?shù)據(jù)的載體的技術(shù)是接受可變的參數(shù)并改變傳入對(duì)象的狀態(tài)。 這些可變對(duì)象可以通過(guò)方法更改其內(nèi)容,然后調(diào)用者可以訪問(wèn)它提供的對(duì)象以確定已被調(diào)用方法應(yīng)用的新?tīng)顟B(tài)設(shè)置。 盡管可以使用任何可變對(duì)象來(lái)完成此操作,但對(duì)于試圖通過(guò)參數(shù)將值傳遞回調(diào)用方的開(kāi)發(fā)人員而言,集合似乎特別有吸引力。

通過(guò)提供的參數(shù)將狀態(tài)傳遞回被調(diào)用有一些缺點(diǎn)。 由于大多數(shù)Java開(kāi)發(fā)人員可能期望參數(shù)傳入而不是傳出(并且Java不提供任何代碼支持來(lái)指定差異),因此這種方法通常違反了使您驚訝的原則 。 鮑勃·馬丁(Bob Martin)在他的《 清潔代碼 》一書(shū)中這樣寫(xiě)道 :“通常,應(yīng)避免使用輸出參數(shù)。” 使用參數(shù)作為方法向調(diào)用者提供狀態(tài)或輸出的方法的另一個(gè)缺點(diǎn)是,這會(huì)增加傳遞給方法的參數(shù)的混亂程度。 考慮到這一點(diǎn),本文的其余部分重點(diǎn)介紹通過(guò)傳入的參數(shù)返回多個(gè)值的替代方法。

盡管Java方法只能返回單個(gè)對(duì)象或基元,但是當(dāng)人們認(rèn)為一個(gè)對(duì)象可以是我們想要的任何對(duì)象時(shí),這實(shí)際上并不是什么限制。 我見(jiàn)過(guò)幾種方法,但不推薦使用。 其中之一是返回對(duì)象實(shí)例的數(shù)組或集合,而每個(gè)Object都是一個(gè)完全不同且通常不相關(guān)的“事物”。 例如,該方法可能返回三個(gè)值作為數(shù)組或集合的三個(gè)元素。 此方法的一種變體是使用一對(duì)元組或n大小的元組返回多個(gè)關(guān)聯(lián)值。 此方法的另一個(gè)變體是返回Java Map,該Java Map將任意鍵映射到它們的關(guān)聯(lián)值。 與其他解決方案一樣,此方法會(huì)給客戶端帶來(lái)不必要的負(fù)擔(dān),讓他們知道那些鍵是什么,并通過(guò)這些鍵訪問(wèn)映射值。

下一個(gè)代碼清單包含幾種不那么吸引人的方法,這些方法用于返回多個(gè)值而不會(huì)劫持方法參數(shù)以返回多個(gè)值。

通過(guò)通用數(shù)據(jù)結(jié)構(gòu)返回多個(gè)值

// ===============================================================// NOTE: These examples are intended solely to illustrate a point// and are NOT recommended for production code.// ===============================================================/*** Provide movie information.* * @return Movie information in form of an array where details are mapped to* elements with the following indexes in the array:* 0 : Movie Title* 1 : Year Released* 2 : Director* 3 : Rating*/public Object[] getMovieInformation(){final Object[] movieDetails ={"World War Z", 2013, "Marc Forster", "PG-13"};return movieDetails;}/*** Provide movie information.* * @return Movie information in form of a List where details are provided* in this order: Movie Title, Year Released, Director, Rating.*/public List<Object> getMovieDetails(){return Arrays.<Object>asList("Ender's Game", 2013, "Gavin Hood", "PG-13");}/*** Provide movie information.* * @return Movie information in Map form. Characteristics of the movie can* be acquired by looking in the map for these key elements: "Title", "Year",* "Director", and "Rating"./*/public Map<String, Object> getMovieDetailsMap(){final HashMap<String, Object> map = new HashMap();map.put("Title", "Despicable Me 2");map.put("Year", 2013);map.put("Director", "Pierre Coffin and Chris Renaud");map.put("Rating", "PG");return map;}

上面顯示的方法確實(shí)滿足了不通過(guò)調(diào)用的方法的參數(shù)將數(shù)據(jù)傳遞回調(diào)用方的意圖,但是在調(diào)用方上仍然沒(méi)有不必要的負(fù)擔(dān)來(lái)了解返回?cái)?shù)據(jù)結(jié)構(gòu)的詳細(xì)信息。 減少方法的參數(shù)數(shù)量并且不違反最小驚喜原則是很好的,但是要求客戶知道復(fù)雜數(shù)據(jù)結(jié)構(gòu)的復(fù)雜性并不是很好。

當(dāng)我需要返回多個(gè)值時(shí),我更喜歡為返回值編寫(xiě)自定義對(duì)象。 與使用數(shù)組,集合或元組結(jié)構(gòu)相比,這需要做更多的工作,但是很少的額外工作(對(duì)于現(xiàn)代Java IDE,通常只有幾分鐘的時(shí)間)會(huì)帶來(lái)可讀性和流利性,而這是這些更通用的方法所不具備的。 我的自定義返回對(duì)象不必在Javadoc上進(jìn)行解釋或要求我的代碼的用戶仔細(xì)閱讀我的代碼,以了解在數(shù)組或集合中按哪個(gè)順序提供了哪些參數(shù),或者在元組中以哪個(gè)值提供了這些參數(shù),而無(wú)需為我的自定義返回對(duì)象定義方法他們告訴客戶確切他們提供什么。

接下來(lái)的代碼片段說(shuō)明了一個(gè)主要由NetBeans生成的簡(jiǎn)單Movie類(lèi),該類(lèi)可以用作返回類(lèi)型,并且可以返回該類(lèi)的實(shí)例的代碼,而不是更通用,更不易理解的數(shù)據(jù)結(jié)構(gòu)。

電影.java

package dustin.examples;import java.util.Objects;/*** Simple Movie class to demonstrate how easy it is to provide multiple values* in a single Java method return and provide readability to the client.* * @author Dustin*/ public class Movie {private final String movieTitle;private final int yearReleased;private final String movieDirectorName;private final String movieRating;public Movie(String movieTitle, int yearReleased, String movieDirectorName, String movieRating){this.movieTitle = movieTitle;this.yearReleased = yearReleased;this.movieDirectorName = movieDirectorName;this.movieRating = movieRating;}public String getMovieTitle(){return movieTitle;}public int getYearReleased(){return yearReleased;}public String getMovieDirectorName(){return movieDirectorName;}public String getMovieRating(){return movieRating;}@Overridepublic int hashCode(){int hash = 3;hash = 89 * hash + Objects.hashCode(this.movieTitle);hash = 89 * hash + this.yearReleased;hash = 89 * hash + Objects.hashCode(this.movieDirectorName);hash = 89 * hash + Objects.hashCode(this.movieRating);return hash;}@Overridepublic boolean equals(Object obj){if (obj == null){return false;}if (getClass() != obj.getClass()){return false;}final Movie other = (Movie) obj;if (!Objects.equals(this.movieTitle, other.movieTitle)){return false;}if (this.yearReleased != other.yearReleased){return false;}if (!Objects.equals(this.movieDirectorName, other.movieDirectorName)){return false;}if (!Objects.equals(this.movieRating, other.movieRating)){return false;}return true;}@Overridepublic String toString(){return "Movie{" + "movieTitle=" + movieTitle + ", yearReleased=" + yearReleased + ", movieDirectorName=" + movieDirectorName + ", movieRating=" + movieRating + '}';} }

在單個(gè)對(duì)象中返回多個(gè)詳細(xì)信息

/*** Provide movie information.* * @return Movie information.*/public Movie getMovieInfo(){return new Movie("Oblivion", 2013, "Joseph Kosinski", "PG-13");}

Movie課的簡(jiǎn)單寫(xiě)作花了我大約5分鐘的時(shí)間。 我使用NetBeans類(lèi)創(chuàng)建向?qū)?lái)選擇類(lèi)名稱和包,然后鍵入該類(lèi)的四個(gè)屬性。 從那里開(kāi)始,我僅使用NetBeans的“插入代碼”機(jī)制來(lái)插入“獲取”訪問(wèn)器方法以及重寫(xiě)的toString() , hashCode()和equals(Object)方法。 如果我認(rèn)為不需要這些,可以簡(jiǎn)化類(lèi),但按原樣創(chuàng)建確實(shí)很容易。 現(xiàn)在,我有一個(gè)更有用的返回類(lèi)型,這由使用該類(lèi)的代碼反映出來(lái)。 它幾乎不需要在返回類(lèi)型上使用Javadoc注釋,因?yàn)樵擃?lèi)型可以說(shuō)明一切,并使用“ get”方法發(fā)布其內(nèi)容。 我認(rèn)為,與通過(guò)方法參數(shù)返回狀態(tài)或使用更通用且更難使用的返回?cái)?shù)據(jù)結(jié)構(gòu)之類(lèi)的替代方法相比,創(chuàng)建這些簡(jiǎn)單的類(lèi)以返回多個(gè)值的少量額外工作將獲得豐厚的回報(bào)。

保留要返回給調(diào)用方的多個(gè)值的自定義類(lèi)型是一種有吸引力的解決方案,這并不奇怪。 畢竟,從概念上講,這與我之前寫(xiě)過(guò)的關(guān)于使用自定義類(lèi)型和參數(shù)對(duì)象傳遞多個(gè)相關(guān)參數(shù)而不是單獨(dú)傳遞它們的概念非常相似。 Java是一種面向?qū)ο蟮恼Z(yǔ)言,當(dāng)我沒(méi)有看到Java代碼中使用對(duì)象來(lái)組織好參數(shù)并在一個(gè)不錯(cuò)的包中返回值時(shí),它使我感到驚訝。

優(yōu)勢(shì)與優(yōu)勢(shì)

使用自定義參數(shù)對(duì)象表示和封裝多個(gè)返回值的優(yōu)點(diǎn)是顯而易見(jiàn)的。 方法的參數(shù)可以保留為“輸入”參數(shù),因?yàn)樗休敵鲂畔?#xff08;通過(guò)異常機(jī)制傳達(dá)的錯(cuò)誤信息除外)都可以在方法返回的自定義對(duì)象中提供。 與使用通用數(shù)組,集合,映射,元組或其他通用數(shù)據(jù)結(jié)構(gòu)相比,這是一種更清潔的方法,因?yàn)樗羞@些替代方法都將開(kāi)發(fā)工作轉(zhuǎn)移到了所有潛在客戶上。

成本與劣勢(shì)

我看到編寫(xiě)具有多個(gè)值的自定義類(lèi)型用作Java方法的返回類(lèi)型的缺點(diǎn)很小。 也許最常聲稱的成本是編寫(xiě)和測(cè)試這些類(lèi)的價(jià)格,但是該成本非常小,因?yàn)檫@些類(lèi)往往很簡(jiǎn)單,并且因?yàn)楝F(xiàn)代IDE為我們完成了大部分工作。 因?yàn)镮DE是自動(dòng)執(zhí)行的,所以代碼通常是正確的。 這些類(lèi)非常簡(jiǎn)單,以使代碼審閱者易于閱讀,并且易于測(cè)試。

為了尋找其他成本和缺點(diǎn),人們可能會(huì)爭(zhēng)辯說(shuō)這些類(lèi)可以膨脹代碼庫(kù)和程序包,但我認(rèn)為這不是一個(gè)強(qiáng)有力的論據(jù)。 盡管自定義類(lèi)實(shí)現(xiàn)不好的風(fēng)險(xiǎn)很小,但我認(rèn)為客戶機(jī)代碼可能會(huì)混淆更通用的返回類(lèi)型的解釋。 另一個(gè)小風(fēng)險(xiǎn)是,開(kāi)發(fā)人員可能將很多無(wú)關(guān)的東西扔到同一個(gè)類(lèi)中,而這些項(xiàng)目之間的唯一關(guān)系是,相同的方法需要返回它們。 即使這樣,我能看到的唯一更好的選擇是修改代碼,而無(wú)需返回多個(gè)值。 在自定義對(duì)象中返回原本不相關(guān)的項(xiàng)似乎仍然比在通用數(shù)據(jù)結(jié)構(gòu)中返回這組不相關(guān)的數(shù)據(jù)更好。 實(shí)際上,這些通用數(shù)據(jù)結(jié)構(gòu)變得更加笨拙并且難以使用,因?yàn)樗鼈兯鶕碛械闹底兊迷絹?lái)越不相關(guān)。

結(jié)論

自定義類(lèi)型和參數(shù)對(duì)象可幫助我們直接解決Java方法中過(guò)多參數(shù)的問(wèn)題。 幸運(yùn)的是,這些自定義類(lèi)型和返回值對(duì)象還可以幫助我們通過(guò)自定義類(lèi)型和返回值對(duì)象返回多個(gè)值,而不需要添加僅用于將輸出信息傳遞回去的附加參數(shù),從而間接地減少所需參數(shù)的數(shù)量。呼叫者,召集者。

參考: Java方法中的參數(shù)太多,第6部分: JCG合作伙伴 Dustin Marx在Inspired by Actual Events博客上的方法返回 。

翻譯自: https://www.javacodegeeks.com/2013/11/too-many-parameters-in-java-methods-part-6-method-returns.html

java方法帶參數(shù)返回值

總結(jié)

以上是生活随笔為你收集整理的java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。