參考鏈接: Java命名約定
創建具有許多參數的方法是一個主要的缺點。 每當需要創建這樣的方法時,就在空氣中聞一聞:這是代碼的味道。 強化單元測試,然后進行重構。 沒有借口,沒有屁股。 重構! 使用構建器模式,甚至更好地使用Fluent API。 對于后者,注釋處理器的影響可能會有很大幫助。??
? 綜上所述,當我們面對現實生活而不是我們在業余愛好項目中可以遵循的理想主義模式時,我們可能會邁入人生的關鍵時刻。 遺留下來的企業庫怪物具有數以千計的參數方法,您沒有權力,時間,勇氣或興趣(對您不利)來修改……操作……對其進行重構。 如果有時間,您可以將構建器創建為外觀,將丑陋的API隱藏在其后。 創建構建器仍然是您甚至在編寫之前就必須進行單元測試的代碼(您知道:TDD),而您可能沒有時間。 調用怪異方法的代碼也已經存在,您只需對其進行維護即可。??
? 您仍然可以做一些小技巧。 它可能并不完美,但是仍然有些完美。??
? 假設有一個方法:??
?public void monster(String contactName, String contactId, String street, String district,
? ? ? ? ? ? ? ? ? ? ...
? ? ? ? ? ? ? ? ? ? Long pT){
...
}
? 首先是在調用者的位置明智地選擇局部變量。 可惜已經選擇了名稱,您可能不想更改它。 可能有某些原因,例如,遵循了應用程序范圍的命名約定,即使您的樣式不是這樣,也可能有意義。 因此調用:??
?monster(nm, "05300" + dI, getStrt(), d, ... , z+g % 3L );
? 不完全是我在說的。 這就是您所擁有的,您可以使用它,也可以在代碼中插入新變量:??
?String contactName = nm;
String contactId = "05300" + dI;
String street = getStrt();
Street district = d;
...
Long pT = z+g % 3L;
monster(contactName, contactId, street, district, ... ,pT );
? 或者甚至可以用Java中不常見的方式編寫它,盡管完全合法:??
?String contactName, contactId, street, district;
...
Long pT;
monster(contactName = nm, contactId = "05300" + dI, street = getStrt(), district = d, ... ,pT = z+g % 3L );
? 好吃嗎 依靠。 我不會在口味上爭論。 如果您不喜歡那樣,還有另一種方法。 您可以定義輔助和非常簡單的靜態方法:??
?static <T> T contactName(T t){ return T;}
static <T> T contactId(T t){ return T;}
static <T> T street(T t){ return T;}
static <T> T district(T t){ return T;}
...
static <T> T pT(T t){ return T;}
?
monster(contactName(nm), contactId("05300" + dI), street(getStrt()(, district(d), ... ,pT(z+g % 3L) );
? 該代碼仍然很丑陋,但是在調用者處更具可讀性。 你甚至可以收集靜態方法為工具類或接口在Java中8的情況下,命名為喜歡with , using , to等等。 您可以將它們靜態導入到您的代碼中,并進行如下一些方法調用:??
?doSomething(using(someParameter), with(someOtherParameter), to(resultStore));
? 如果您回答了最后一個問題,那么所有這些都將使您感到惱: * pT是什么祝福。??
? ( * “隨便什么,您都可以用其他任何單詞代替”)??
?
? 翻譯自: https://www.javacodegeeks.com/2014/09/named-parameters-in-java.html