Что означает / делает синтаксис "final String ... args"? - PullRequest
6 голосов
/ 26 февраля 2011

Это должен быть довольно простой вопрос.Я осмотрелся и не смог найти ни одной темы по этому синтаксису, а "..." затрудняет поиск в Google.Я работаю над простым тестовым приложением для копирования файла базы данных из его защищенного местоположения на нерутованном телефоне Android в место на SD-карте, к которому я могу получить доступ для просмотра с помощью инструмента просмотра базы данных sqlite3 ,Я знаю, что это похоже на обходной путь, но эмулятор отказывается открываться на моем нетбуке, поэтому сейчас я использую свой мобильный телефон для проверки разработки.

Код уже написанпоэтому я заимствую его отсюда и адаптирую к своему коду.Я наткнулся на этот небольшой фрагмент кода:

private class ExportDatabaseFileTask extends AsyncTask<String, Void, Boolean> {
  private final ProgressDialog dialog = new ProgressDialog(ManageData.this);

  // can use UI thread here
  protected void onPreExecute() {
     this.dialog.setMessage("Exporting database...");
     this.dialog.show();
  }

  // automatically done on worker thread (separate from UI thread)
  protected Boolean doInBackground(final String... args) {

Я никогда не видел аргумент final String... args раньше.Что это значит / делает?

Спасибо!Moscro

Ответы [ 2 ]

11 голосов
/ 26 февраля 2011

Эллипсы в аргументе в Java означают vararg типа.Таким образом, в вашем случае ... означает, что вы можете передавать любое количество параметров String в методы doInBackground.

Итак, вы можете вызвать этот метод doInBackground("String1", "String2", "String3") или также doInBackground("String1") или также doInBackground("String1", "String2", "String3", "String4") или любой другой формой.

Смотрите здесь http://download.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

Три периода после типа последнего параметра указывают, что последний аргумент может быть передан как массив или как последовательность аргументов.Varargs можно использовать только в последней позиции аргумента.Учитывая новое объявление varargs для MessageFormat.format, вышеуказанный вызов может быть заменен следующим более коротким и более сладким вызовом

, а final имеет свое обычное значение.Кстати, эта функция доступна в Java5 или новее.

См .: http://www.developer.com/java/other/article.php/3323661

Как упоминалось в двух вышеупомянутых ссылках, это не что иное, как массив сахаров.По сути, когда вы определяете myMethod(T... vararg), Java видит его как myMethod(T[] vararg).И когда вы звоните, myObj.myMethod(t1, t2, t3, ..., tn), Java передает его как myObj.myMethod(new T[]{t1, t2, t3, ..., tn}).

4 голосов
/ 26 февраля 2011

final означает, что args нельзя переназначить в doInBackground.String... - это " vararg ."В метод doInBackground можно передать любое количество String объектов.

* String... - это на самом деле String[] - буквально это массив String, к которому можно получить доступ как таковой.

...