При программировании для 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
.String...
как будто этоString[]
String[]
, но давайте предположим, что это было по умолчаниюString[]
. Было бы довольно проблематично использовать другойString
параметр в массиве. Вместо этого они дали гибкость в использовании(String ...)
.new String[]{...}
конвертировать (это то, что на самом деле происходит, когда вы используетеString...
)Ответы:
(String ...)
является массивом параметров типаString
, где asString[]
является единственным параметром .Теперь здесь
String[]
можно полностью выполнить ту же цель, но(String ...)
обеспечивает большую удобочитаемость и простоту использования.Он также предоставляет возможность, с помощью которой мы можем передавать несколько массивов,
String
а не одинString[]
.источник
String[]
может быть передано в метод, принимающийString...
в качестве параметра, дваString[]
s не могут. Здесь не существует неявной конкатенации массивов.Особенностью String [] против String ... является то, что "String ..." не обязательно должен быть частью вызова.
Тогда, если вы позвоните,
callerTest();
вывод будет:источник