3 回答

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
一個(gè)好的經(jīng)驗(yàn)法則是:
“對(duì)任何需要T數(shù)組(無(wú)論T類(lèi)型)作為輸入的方法(或構(gòu)造函數(shù))使用varargs”。
這將使這些方法的調(diào)用更容易(不需要這樣做new T[]{...}
)。
您可以擴(kuò)展此規(guī)則以包含帶List<T>
參數(shù)的方法,前提是此參數(shù)僅用于輸入(即,該方法不修改列表)。
另外,我會(huì)避免使用,f(Object... args)
因?yàn)樗腁PI 會(huì)出現(xiàn)不明確的編程方式。
在示例方面,我在DesignGridLayout中使用它,我可以JComponent
在一個(gè)調(diào)用中添加幾個(gè)s:
layout.row().grid(new JLabel("Label")).add(field1, field2, field3);
在上面的代碼中,add()方法定義為add(JComponent... components)
。
最后,這些方法的實(shí)現(xiàn)必須注意它可以用空的vararg調(diào)用它!如果你想強(qiáng)加至少一個(gè)參數(shù),那么你必須使用一個(gè)丑陋的技巧,例如:
void f(T arg1, T... args) {...}
我認(rèn)為這個(gè)技巧很難看,因?yàn)樵摲椒ǖ膶?shí)現(xiàn)不如僅僅T... args
在其參數(shù)列表中那么簡(jiǎn)單。
希望這有助于澄清關(guān)于varargs的觀點(diǎn)。

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
我經(jīng)常使用varargs輸出到日志以進(jìn)行調(diào)試。
幾乎我的應(yīng)用程序中的每個(gè)類(lèi)都有一個(gè)方法debugPrint():
private void debugPrint(Object... msg) { for (Object item : msg) System.out.print(item); System.out.println();}
然后,在類(lèi)的方法中,我有如下調(diào)用:
debugPrint("for assignment ", hwId, ", student ", studentId, ", question ", serialNo, ", the grade is ", grade);
當(dāng)我對(duì)我的代碼正常工作感到滿(mǎn)意時(shí),我會(huì)在debugPrint()方法中注釋掉代碼,這樣日志就不會(huì)包含太多無(wú)關(guān)和不需要的信息,但是我可以將對(duì)debugPrint()的各個(gè)調(diào)用取消注釋。稍后,如果我發(fā)現(xiàn)了一個(gè)錯(cuò)誤,我只需取消注釋debugPrint()代碼,并重新激活我對(duì)debugPrint()的所有調(diào)用。
當(dāng)然,我可以輕易地避開(kāi)varargs并執(zhí)行以下操作:
private void debugPrint(String msg) { System.out.println(msg);}debugPrint("for assignment " + hwId + ", student " + studentId + ", question " + serialNo + ", the grade is " + grade);
但是,在這種情況下,當(dāng)我注釋掉debugPrint()代碼時(shí),服務(wù)器仍然需要在每次調(diào)用debugPrint()時(shí)連接所有變量的麻煩,即使對(duì)結(jié)果字符串沒(méi)有任何處理。但是,如果我使用varargs,服務(wù)器只有在意識(shí)到它不需要它們之前才必須將它們放在一個(gè)數(shù)組中。節(jié)省了很多時(shí)間。
添加回答
舉報(bào)