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

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

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

什么是可变参数?

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

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

示例1

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);}    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);}

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

name=Java技术栈&memo=666666

示例2

public static void main(String[] args) {    test("name=%s&memo=%s", "Java技术栈");}private static void test(String text, O

我把 "666" 移到了子方法里面,放到了 format 最后,再来看下结果是什么。

name=[Ljava.lang.Object;@4cb2c100&memo=6664cb2c100&memo=666

这并非是我想要的结果,把可变参数 params 数组对象地址作为值输出出来了,把我搞得够惨,最后我干掉了可变参数。。


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


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


相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object 。


说明:可变参数必须放置在参数列表的最后。 ( 提倡同学们尽量不用可变参数编程 )


正例: public ListlistUsers(String type, Long… ids) {…}


获取这份阿里巴巴的Java开发手册最新PDF版,大家可以关注Java技术栈微信公众号,在后台回复:手册,即可获取。


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


另外,栈长已经整理了大量 Java 系列核心技术知识点文章,关注Java技术栈微信公众号,在后台回复关键字:java,即可获取最新版。



相关文章
|
5月前
|
IDE Java 编译器
五分钟学Java:可变参数究竟是怎么一回事?
五分钟学Java:可变参数究竟是怎么一回事?
|
6月前
|
Java 编译器
滚雪球学Java(36):玩转Java方法重载和可变参数,让你的代码更灵活
【5月更文挑战第11天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
43 0
滚雪球学Java(36):玩转Java方法重载和可变参数,让你的代码更灵活
|
6月前
|
存储 Java
Java 可变参数:灵活的函数调用艺术
【4月更文挑战第21天】
76 1
|
Java API
JAVA可变参数 ( IDEA演示 )
在 Java 5 中提供了变长参数,允许在调用方法时传入不定长度的参数,本质上还是基于数组的实现在定义方法时,在最后一个形参后加上三点 …,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。可变参数格式:可变参数作用: 输出结果:一个形参列表中可变参数只能有一个 可变参数必须放在形参列表的最后面ArrayList工具类有一个静态方法: public static List asList(T…a){},对返回集合不能进行增删,可以修改 List接口有一个静态方法: public stat
50 0
|
6月前
|
存储 Java
Java中的可变参数
Java中的可变参数
33 0
|
Java
Java 可变参数(详细使用)
Java 可变参数(详细使用)
90 0
|
6月前
|
存储 Java
从零开始学习 Java:简单易懂的入门指南之可变参数及Collections类(二十五)
从零开始学习 Java:简单易懂的入门指南之可变参数及Collections类(二十五)
|
6月前
|
存储 Java
Java之可变参数和Collections的详细解析
1. 可变参数 在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化. 格式: 修饰符 返回值类型 方法名(参数类型... 形参名){ } 底层:
55 0
|
Java
Java可变参数
Java可变参数
38 0
|
Java C语言
【Java】可变参数
【Java】可变参数
78 0