最近在寫一個功能點,用了 Java 中的可變參數,真是把我搞得夠慘。。java
什麼是可變參數?編程
就是方法參數用 Object... args
三個點形式,一個參數能夠接收多個參數。數組
實際的代碼就不帖了,來看這個示例吧:微信
示例1code
public static void main(String[] args) { test("name=%s&memo=%s", "Java技術棧", "666"); } private static void test(String text, Object... params) { String result = String.format(text, params); System.out.println(result); }
你們猜結果是什麼?結果如咱們想象:orm
name=Java技術棧&memo=666
示例2對象
public static void main(String[] args) { test("name=%s&memo=%s", "Java技術棧"); } private static void test(String text, Object... params) { String result = String.format(text, params, "666"); System.out.println(result); }
我把 "666" 移到了子方法裏面,放到了 format 最後,再來看下結果是什麼。開發
name=[Ljava.lang.Object;@4cb2c100&memo=666
這並不是是我想要的結果,把可變參數 params 數組對象地址做爲值輸出出來了,把我搞得夠慘,最後我幹掉了可變參數。。ast
JDK裏面不少有用到可變參數的,可實際開發中,並不建議使用可變參考,它帶來的困擾和潛在的問題會遠大於便利性,好比在方法重構、重寫等也會帶來不少問題。form
關於可變參數,也是有開發規範的,不能隨便寫。我找到了阿里巴巴的《Java開發手冊》中關於可變參數的規約。
相同參數類型,相同業務含義,才能夠使用 Java 的可變參數,避免使用 Object 。
說明:可變參數必須放置在參數列表的最後。 ( 提倡同窗們儘可能不用可變參數編程 )
正例: public List
listUsers(String type, Long... ids) {...}
獲取這份阿里巴巴的Java開發手冊最新PDF版,你們能夠關注Java技術棧微信公衆號,在後臺回覆:手冊,便可獲取。
阿里巴巴也是不建議你們合做可變參數的,可知它帶來的坑會有多坑。。
另外,棧長已經整理了大量 Java 系列核心技術知識點文章,關注Java技術棧微信公衆號,在後臺回覆關鍵字:java,便可獲取最新版。
本文原創首發於微信公衆號:Java技術棧(id:javastack),轉載請原樣保留本信息。