java代码编写出现的陷阱-1:警惕变长参数
在Java5 中提供了變長(zhǎng)參數(shù)(varargs),也就是在方法定義中可以使用個(gè)數(shù)不確定的參數(shù),對(duì)于同一方法可以使用不同個(gè)數(shù)的參數(shù)調(diào)用,調(diào)用的時(shí)候可以給出任意多個(gè)參數(shù)也可不給參數(shù).
如method(Object...objs){...} . ?調(diào)用時(shí)的代碼是:method("str") 或者method(null),method("張三","李四","王五").
但是如果出現(xiàn)下面的情況,可就麻煩了,不多說(shuō),看代碼:
public class Client { ? ?
? ? //簡(jiǎn)單折扣計(jì)算 ?
? ? public void calPrice(int price,int discount){ ?
? ? ? ? ? float knockdownPrice =price * discount / 100.0F; ?
? ? ? ? ? System.out.println("折扣后的價(jià)格:"+formateCurrency(knockdownPrice)); ?
? ? } ? ?
? ? //復(fù)雜多折扣計(jì)算(出現(xiàn)在折上折需求上)
? ?public void calPrice(int price,int... discounts){ ?
? ? ? ? ? float knockdownPrice = price; ?
? ? ? ? ? for(int discount:discounts){ ?
? ? ? ? ? ? ? ?knockdownPrice = knockdownPrice * discount / 100; ?
? ? ? ? ? } ?
? ? ? ? ? ? System.out.println("折上折后的價(jià)格:"+formateCurrency(knockdownPrice));
? ?} ?
? ? //格式化成本的貨幣形式 ?
? ? private String formateCurrency(float price){ ?
? ? ? ? ? ?return NumberFormat.getCurrencyInstance().format(price/100); ?
? ? } ?
? ? public static void main(String[] args) { ?
? ? ? ? ? Client client = new Client(); ?
? ? ? ? ? //499元的貨物,打75折
? ? ? ? ? client.calPrice(49900, 75); ?
? ? } ?
? ?程序調(diào)用了最終調(diào)用了非變長(zhǎng)參數(shù)的方法,因?yàn)閖ava在編譯時(shí),首先會(huì)根據(jù)實(shí)參的數(shù)量和類(lèi)型來(lái)進(jìn)行處理,而且確定是否符合方法簽名條件,而兩個(gè)重載方法中,int類(lèi)型的是一個(gè)原生數(shù)據(jù)類(lèi)型,而多變參數(shù)實(shí)際上是一個(gè)數(shù)組對(duì)象,編譯器偷懶,于是先從簡(jiǎn)單的方法簽名開(kāi)始,如果符合條件,即可編譯通過(guò),于是就出現(xiàn)了這種情況。
下面變長(zhǎng)參數(shù)方法還有一種情況挺煩人的,看代碼:
public class Client {
? ? public void methodA(String...strs){ }
? ? public void methodA(Integer...ints){ }
? ? public static void main(String[] args) { ?
? ? ? ? ? Client client = new Client(); ?
? ? ? ? ? //調(diào)用方法
? ? ? ? ? client.methodA(null); ? ?//編譯出錯(cuò)
? ? } ?
為什么會(huì)編譯編譯出錯(cuò)了,兩個(gè)方法重載是沒(méi)問(wèn)題的,但是在調(diào)用時(shí),傳入的參數(shù)直接使用實(shí)參數(shù)值,這樣java編譯器無(wú)法判斷null屬于何種數(shù)據(jù)對(duì)象.不僅僅調(diào)用者需要"猜測(cè)"該調(diào)用哪個(gè)方法,而且被調(diào)用者也可能產(chǎn)生內(nèi)部邏輯混亂的情況.
這個(gè)問(wèn)題的解決方案有兩種:
<1> 調(diào)用methodA方法時(shí),設(shè)置null一個(gè)類(lèi)型,將變量作為參數(shù)傳入.
<2> methodA方法不重載,將其中的一個(gè)方法名改掉.
轉(zhuǎn)載于:https://blog.51cto.com/javacrazy/1375511
總結(jié)
以上是生活随笔為你收集整理的java代码编写出现的陷阱-1:警惕变长参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 哈希表(HashTable)探究(转)
- 下一篇: linq to json for sl