varargs и' …' аргумент

Я полагаю, что самый легкий путь состоял бы в том, чтобы последовать собственному совету Jeff и взглянуть вокруг существующего кода. Попытайтесь смотреть на Wordpress, Drupal, Joomla и другой известный основанный на PHP CMS, чтобы видеть, как их API сцепляет стиль. Таким образом, можно даже получить идеи, о которых Вы не могли думать ранее для создания вещей немного большим количеством rubust.

А более прямой ответ должен был бы записать общие файлы, что они будут "include_once" в свой файл, который обеспечил бы удобство использования, в котором они будут нуждаться. Это было бы разбито в категории и НЕ обеспечено в одном КРУПНОМ "hooks.php" файле. Будьте осторожны, хотя, потому что, что заканчивает тем, что произошло, то, что файлы, которые они включают, заканчивают тем, что имели все больше зависимостей, и функциональность улучшается. Попытайтесь поддержать зависимости от API на низком уровне. Т.Е. меньше файлов для них для включения.

47
задан Cœur 14 December 2017 в 17:24
поделиться

3 ответа

From the docs on varargs:

The three periods after the final parameter's type indicate that the final argument may be passed as an array or as a sequence of arguments.

So you can pass multiple arguments or an array.

The following works just fine:

class VarargTest {
  public static void main(String[] args) {
    Object[] params = {"x", 1.2345f};
    String s = String.format("%s is %.2f", params);
    System.out.println(s); // Output is: x is 1.23
  }
}
53
ответ дан 26 November 2019 в 19:47
поделиться

Вы можете просто передать массив:

public void foo(String... args) {
}

String args[] = new String[10];
foo(args);
10
ответ дан 26 November 2019 в 19:47
поделиться

Ситуация, которую вы описываете, будет довольно редкой: в большинстве случаев ваши элементы varargs будут String s, или числами, или Widget s ... для них будет необычно быть Object s (что может быть что угодно) или массивы.

Но если аргумент varargs - это набор Object s или тип массива, тогда у вас возникает вопрос: вы можете передать ему один массив, а затем как компилятор узнает, хотите ли вы передать массив (тот, который вы указали) или серию 1 элемент, который он должен ЗАПИСАТЬ в массив для вас?

Быстрый тест показывает ответ:

public class TestClass {
    public static void main(String[] args) {
        Object anObject = new Object();
        Object[] anArray = new Object[] {anObject, anObject};
        System.out.println("object1 = " + anObject);
        System.out.println("array1 = " + anArray);
        takesArgs();
        takesArgs(anObject, anObject);
        takesArgs(anArray); // is this the same as array1?
        takesArgs(anArray, anArray);
    }

    public static void takesArgs(Object... stuff) {
        System.out.println("The array was " + stuff);
    }
}

Результат выполнения (ваши точные числа будут отличаться:

object1 = java.lang.Object@3e25a5
array1 = [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@addbf1
The array was [Ljava.lang.Object;@42e816
The array was [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@9304b1

Итак, ответ заключается в том, что в неоднозначных случаях он обрабатывает то, что вы передали как массив вместо создания нового массива для его обертывания.Это имеет смысл, так как вы всегда можете сами обернуть его в массив, если хотите другую интерпретацию.

8
ответ дан 26 November 2019 в 19:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: