【每日一思】Java可变参数

1,500 阅读2分钟

Java可变参数

《关于这个语法糖太过少见以至于我完全不记得有学过》

基本语法

在 Java 5 中提供了变长参数,允许在调用方法时传入不定长度的参数。变长参数是 Java 的一个语法糖,本质上还是基于数组的实现。

在定义方法时,在最后一个形参后加上三点...,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。

使用过程和数组其实没有什么大的差别,只是无需使用数组的形式罢了。

这个语法糖不是那么滴甜。

// 定义
public static void fun(String... strings) {
    for (String s : strings) {
        System.out.println(s);
    }
}
// 使用
public static void main(String[] args) {
    fun();
    fun("123", "456");
    fun("123244");
}

使用限制:

  • 变长参数至多有一个。
  • 变长参数只能是最后一个参数。

使用场景

我一直是不太习惯使用这个语法糖的,也担心使用了很造成什么问题。不过对一个事物的恐惧源于对它的不了解,现在理解了它的原理,也可以用起来了。

SO上有一个经典的讨论,结论是:当你不知道方法中要传递几个参数/你想传递不定数量的参数时使用。

Why to use this?

  1. What if, you don't know the number of arguments to pass for a method?
  2. What if, you want to pass unlimited number of arguments to a method?

How this works?

It creates an array with the given arguments & passes the array to the method.

注意事项

1、不可与有相同签名的数组参数方法重载

本质上是个数组,这也就带来了一个很明显的问题,方法重载时可以吗?

void fun(String[] strings){}
void fun(String... strings){}

答案是不可行的,二者会拥有相同的签名,导致编译报错。

2、优先匹配固定参数

当拥有固定参数和可变参数时,会优先匹配固定参数。

参考文章

1、Java 可变参数 | 菜鸟教程 (runoob.com)

2、variadic functions - When do you use varargs in Java? - Stack Overflow