String [] args与(String。。。args)


9

在为android编程时,每当我使用AsyncTask时,doInBackground方法都将如下所示。

 protected String doInBackground(String... args)

但是当在那个块中的任何地方使用参数时,我可以像在程序中一样使用普通的String数组来访问它们

        @Override
    protected String doInBackground(String... args)
    {
        String details = "";
        try
        {
            details = facade.getRecipeDetails(args[0]);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        return details;
    }

哪个工作正常,我没有问题。但是我想知道为什么他们使用(String。。。args)而不是普通的String数组。仅仅是因为在调用方法中您可以编写如下内容:

 new AsyncHandler.execute("argument1","argument2","argument3",...)  

而不是创建一个新的数组来传递参数?虽然我们可以写

new AsyncHandler().execute(new String[]{"Argument1","Argument2"});

这有点冗长。

(String ...)和String []在它们的工作方式上是否是同义词,但是使用参数前者更容易传递参数,因为无需创建数组?据我所知,前者还会在后台转换为字符串数组,因此它们是否都可以编译为相同的代码,而只是“语法糖”?


(String ...)意味着您可以根据需要添加尽可能多的String参数,这String[]是一个参数,它是一个字符串数组。(String ...)取决于的第一个参数AsyncTask,并非总是这样String
FaizanRabbani 2014年

@FaizanRabbani,除了您也可以像称呼String...它一样String[]
棘手怪胎

@ratchetfreak是的,它可以充当a String[],但是让我们假设它是默认设置String[]String在数组中使用不同的参数将是一个很大的问题。相反,它们提供了使用的灵活性(String ...)
FaizanRabbani 2014年

@FaizanRabbani我知道它并不总是String,它只是一个示例=)。布尔...或其他东西也一样,但是由于我们熟悉的main(String [] args),我喜欢使用String。您说过“您可以传递任意数量的字符串”,那么您可以通过数组传递很多字符串。在我看来,尽管可读性差且麻烦多了,但似乎仍然可以使用数组实现相同的目的。(例如,传递数组的数组会稍微降低可读性)。那主要是为了可读性是正确的吗?(感谢已经顺便说一句)
Dylan Meeus 2014年

@FaizanRabbani好吧,这是new String[]{...}转换的简单包装(这是您使用时实际发生的事情String...
棘轮怪胎2014年

Answers:


15

(String ...)是类型为参数的数组String,其中as String[]单个参数

现在,这里String[]可以完全满足这里的相同目的,但(String ...)可以提供更高的可读性和易用性。

它还提供了一个选项,使我们可以String使用而不是单个数组传递多个数组String[]


1
虽然String[]可以传递给以String...参数为参数的方法,但是两个String[]不能。这里没有隐式数组串联。

5

String [] vs String ...的一个特征是“ String ...”不需要成为调用的一部分。

public void test(String... args){ 
   if(args.length > 0){
      for( String text : args){
         System.out.println(text);
      }
   }else{
      System.out.println("No args defined.");
   }
}

public void callerTest(){
     test();
     System.out.println();

     test("tree");
     System.out.println();

     test("dog", "cat", "pigeon");
}

然后,如果您调用callerTest();输出,将为:

No args defined.

tree

dog
cat
pigeon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.