Varargs 和无参数方法

Varargs and argument less method

我刚刚赶上 java 1.5,(是的,我知道还为时过早;))。在对 varargs 进行一些练习时,我发现了一些奇怪的东西,如下所示。代码编译良好,仅当我提供至少一个参数时才调用 varargs 方法。这不应该是编译器错误,一个方法和带有可变参数的重载方法。或者您可能会想到任何特定的用例,这种情况将 有用

public class VarargsExample {
    public static void main(String args[]) {    
        test1();
    }

    public static void test1(int... x) {
        System.out.println("AssertionExample.test1(ARRAY METHOD)");
    }

    public static void test1() {
        System.out.println("AssertionExample.test1(PARAM LESS)");
    }

}

PS: 试图在 SO 中搜索这个,找不到类似的。如果已经有的话请原谅我:)

总结,感谢大家的快速回复。似乎是常规方法是首选。当存在单个参数方法时也是如此

public class VarargsExample{  
 public static void main( String args[] ){  


  test1(); 
  test1(2); 
 } 

 public static  void test1(int... x){
     System.out.println("AssertionExample.test1(ARRAY METHOD)");
 }

 public static  void test1(int x){
     System.out.println("AssertionExample.test1(single param METHOD)");
 }

 public static void test1(){
     System.out.println("AssertionExample.test1(PARAM LESS)");
 } 

}  

首先调用无参数重载,因为它的签名比可变参数重载的签名更具体。使用两个执行完全不同操作的重载方法通常是一个非常糟糕的主意。因此,让我们假设无参数方法在不带参数调用时与可变参数方法执行相同的操作,即无参数方法是可变参数方法的特化。

那么一个用例如下。调用可变参数方法总是需要创建一个数组。虽然一开始我当然不会过多考虑此类小的优化,但在某些情况下(例如在紧密循环中),它的开销可能足够大。该方法的无参数版本不需要创建数组,另外还可能包含针对特定情况的其他优化。

有时候,一个人看到的不止一个专业,一个没有论据,一个有一个,一个有两个,还有一个通用的方法。例如:

void doSomething() { ... }
void doSomething(String a1) { ... }
void doSomething(String a1, String a2) { ... }
void doSomething(String... as) { ... }

但我建议只在开发后期才这样做,如果有的话。