天天看點

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