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

歡迎訪問 生活随笔!

生活随笔

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

java

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

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

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

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

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

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

盡管方法的返回類型和拋出的異常旨在作為方法將信息返回給調(diào)用方的主要方法,但有時(shí)仍傾向于通過傳遞給方法的參數(shù)來返回?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ì)象或原語,并且異常僅允許返回Throwable且應(yīng)僅將其用于報(bào)告異常情況,因此Java開發(fā)人員劫持參數(shù)作為返回?cái)?shù)據(jù)的替代途徑變得越來越有吸引力給來電者。

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

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

盡管Java方法只能返回單個(gè)對(duì)象或基元,但是當(dāng)人們認(rèn)為一個(gè)對(duì)象可以是我們想要的任何對(duì)象時(shí),這實(shí)際上并不是什么限制。 我見過幾種方法,但不推薦使用。 其中之一是返回對(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ì)給客戶端帶來不必要的負(fù)擔(dān),讓他們知道那些鍵是什么,并通過這些鍵訪問映射值。

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

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

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

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

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

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

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

成本與劣勢(shì)

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

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

結(jié)論

自定義類型和參數(shù)對(duì)象可幫助我們直接解決Java方法中過多參數(shù)的問題。 幸運(yùn)的是,這些自定義類型和返回值對(duì)象還可以幫助我們通過自定義類型和返回值對(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部分:方法返回的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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