Varargs和论证少的方法

时间:2015-04-04 10:22:58

标签: java variadic-functions

我正在追赶java 1.5,(是的,我知道它太早了;))。在varargs上尝试一些练习时,我发现了一些奇怪的东西,如下所示。代码编译得很好,只有当我提供至少一个参数时才调用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)");
 } 

}  

1 个答案:

答案 0 :(得分:3)

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

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

有时,人们会看到一个以上的专业化,一个没有参数,一个有一个,一个有两个,一般方法。例如:

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

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