String [] args vs (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) замість звичайного масиву Strings. Це лише тому, що в методі виклику ви можете просто написати щось на кшталт:

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

замість створення нового масиву для передачі аргументів? Хоча ми могли б написати

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

що трохи більше багатослівного.

Чи (String ...) і String [] є синонімом того, як вони працюють, але передача аргументів просто легше використовувати перший, оскільки немає необхідності створювати масив? Наскільки я можу сказати, колишній також перекладається на рядковий масив у фоновому режимі, тож вони б обоє компілювали в один і той же код, і це просто "синтаксичний цукор"?


(String ...)означає, що ви можете додати стільки Stringпарам, скільки хочете, String[]це один параметр, який є масивом рядків. (String ...)Залежить від першого парамуму AsyncTask, це не завжди String.
FaizanRabbani

@FaizanRabbani за винятком того, що ви також можете зателефонувати String...як ніби цеString[]
ratchet freak

@ratchetfreak Так, він може діяти як String[], але припускаємо, що це було за замовчуванням String[]. Використовувати різні Stringпараметри в масиві було б досить проблемою . Натомість вони дали гнучкість у використанні (String ...).
FaizanRabbani

@FaizanRabbani Я знаю, що це не завжди String, це лише приклад =). Те саме стосується Boolean ... або інших речей, але мені подобалося використовувати String завдяки головним (String [] аргументам), з якими ми знайомі. І ви сказали, що "ви можете передавати стільки рядків, скільки хочете", і ви можете пропустити досить багато рядків з масивом. Мені все ще здається, що ти можеш досягти того ж з масивами, хоча це менш читабельно і більше клопоту. (Наприклад, передача масиву масивів, трохи зменшить читабельність). Чи правильно, що тоді це головним чином для читабельності? (спасибі вже btw)
Ділан Мейус

@FaizanRabbani добре, що це new String[]{...}конвертувати конверсію (це те, що відбувається насправді, коли ви використовуєте a String...)
храповик виродка

Відповіді:


15

(String ...)це масив параметрів типу String, де as String[]- це один параметр .

Тепер тут String[]можна повністю заповнити ту саму мету, але (String ...)забезпечує більше читабельності та простоти у використанні.

Він також надає можливість, що ми можемо пропустити декілька масивів, Stringа не один, використовуючи String[].


1
Хоча це String[]може бути передано в метод, який бере String...параметр, два String[]s не можуть. Тут не існує неявної конкатенації масиву.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.