坑爹的 Java 可变参数,把我整得够惨。。

最近在写一个功能点,用了 Java 中的可变参数,真是把我搞得够惨。。

什么是可变参数?

就是方法参数用 Object… args 三个点形式,一个参数可以接收多个参数。

实际的代码就不帖了,来看这个示例吧:

示例1

public static void main(String[] args) {
    test("name=%s&memo=%s", "陈国际博客", "666");
}

private static void test(String text, Object... params) {
    String result = String.format(text, params);
    System.out.println(result);
}

大家猜结果是什么?结果如我们想象:

name=陈国际博客&memo=666

示例2

public static void main(String[] args) {
    test("name=%s&memo=%s", "陈国际博客");
}

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 数组对象地址作为值输出出来了,把我搞得够惨,最后我干掉了可变参数。。

JDK里面很多有用到可变参数的,可实际开发中,并不建议使用可变参考,它带来的困扰和潜在的问题会远大于便利性,比如在方法重构、重写等也会带来很多问题。

关于可变参数,也是有开发规范的,不能随便写。我找到了阿里巴巴的《Java开发手册》中关于可变参数的规约。

相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object 。
说明:可变参数必须放置在参数列表的最后。 ( 提倡同学们尽量不用可变参数编程 )
正例: public ListlistUsers(String type, Long… ids) {…}

阿里巴巴也是不建议大家合作可变参数的,可知它带来的坑会有多坑。。


   转载请注明


《坑爹的 Java 可变参数,把我整得够惨。。》 by chen guoji under cc_by_name licensed
 上一篇
SQLServer 日期函数大全 SQLServer 日期函数大全
一、统计语句1、–统计当前【>当天00点以后的数据】SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT(Nvarchar, GETDATE(), 11
2019-06-15
下一篇 
想成为顶尖 Java 程序员?先过了下面这些问题! 想成为顶尖 Java 程序员?先过了下面这些问题!
一、数据结构与算法基础1、说一下几种常见的排序算法和分别的复杂度。 2、用Java写一个冒泡排序算法 3、描述一下链式存储结构。 4、如何遍历一棵二叉树? 5、倒排一个LinkedList。 6、用Java写一个递归遍历目录下面的所有文件。
2019-06-09
  目录