为什么foo(Object ... obj)在Java 1.5中实现?

时间:2012-11-28 04:10:00

标签: java java-ee

作为两个功能

foo(Object... obj)
{
for(int i=0;i<obj.length;i++)
System.out.println(obj[i]);
}

foo(Object [] obj)
{
for(int i=0;i<obj.length;i++)
    System.out.println(obj[i]);
}

可以完成函数调用

FOO(OBJ,STR,1);

FOO({OBJ,STR,1});

分别执行相同的功能,后者从java的开头就存在了为什么Object ... obj被实现了

哪一个更好,为什么?

3 个答案:

答案 0 :(得分:5)

...函数是一种syntactic sugar - 它们提供更方便的语法(没有大括号)而不会改变其他任何东西,包括性能。编译器在场景后面做同样的事情,让你使用更方便的语法。

答案 1 :(得分:1)

这不起作用:

foo({obj, str, 1});

您需要这样做:

foo(new Object[] {obj, str, 1});

这很尴尬,我非常感谢varargs语法。从功能上讲,你是完全相同的。

答案 2 :(得分:0)

另外一个用于Syntactic Sugar ...所以简单地说它只是意味着它可以让你的代码变得更好。这是一个例子:

public class App {

    public static void main(String[] args) {
        Object obj = new Object();
        String str = "test";
        varArgsFoo(obj, str, 1); //Don't have to use an Array...
        varArgsFoo(new Object[]{obj, str, 1}); //But you can if it suits you.
        arrayFoo(new Object[]{obj, str, 1}); // Compiles, but you MUST pass in an Array.
        arrayFoo(obj, str, 1); // Won't compile!!! Varargs won't work if an array is expected.

    }

    /**
     * Can use simply a variable number of arguments, or an array whatever you like.
     * @param obj
     */
    static void varArgsFoo(Object... obj) {
        for (int i = 0; i < obj.length; i++) {
            System.out.println(obj[i]);
        }
    }

    /**
     * Must use an array, varargs (the ... notation) won't work.
     *
     * @param obj
     */
    static void arrayFoo(Object[] obj) {
        for (int i = 0; i < obj.length; i++) {
            System.out.println(obj[i]);
        }
    }
}