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