web-dev-qa-db-ja.com

String [] args vs(String。。。args)

Android向けのプログラミングでは、AsyncTaskを使用するたびに、doInBackgroundメソッドは次のようになります。

 protected String doInBackground(String... args)

しかし、そのブロック内のどこかで引数を使用すると、たとえば私のプログラムでは、通常の文字列配列のようにそれらにアクセスできます

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

これは問題なく機能し、私は問題なく処理できます。しかし、なぜ通常の文字列配列の代わりに(String。。。args)を使用するのか疑問に思っています。それは呼び出しメソッドで次のようなものを書くことができるからです:

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

引数を渡す新しい配列を作成する代わりに?書けたけど

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

これはもう少し冗長です。

(String ...)とString []は同じように機能しますが、配列を作成する必要がないため、前者を使用すると引数の受け渡しが簡単になりますか?私が知る限り、前者もバックグラウンドで文字列配列に変換されるので、両方とも同じコードにコンパイルされ、それは単に「構文上の砂糖」にすぎませんか?

9
Dylan Meeus

(String ...)は、タイプStringの-​​パラメータの配列であり、String[]単一のパラメータです。

ここでString[]はここで同じ目的を完全に満たすことができますが、(String ...)は読みやすさと使いやすさを提供します。

また、String[]を使用して単一の配列ではなく、Stringの複数の配列を渡すことができるオプションも提供します。

15
FaizanRabbani

String []と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
_
5
GetBackerZ