Есть ли способ указать конструктор, который принимает массив, а затем передать непосредственно этому конструктору список предопределенных значений для этого массива.

Вот пример:

Допустим, у вас есть вызов enum Единица .

public enum Unit {

    PROBE   (null),
    STALKER (null);

    private final String[] require;

    Unit(String[] require) {
        this.require  = require;
    }

    public String[] require() { return require; }
}

Следующий код, приведенный выше, действителен, но что, если я хочу заменить нули списком значений?

Например, вот что я хотел бы сделать, но это недействительно:

public enum Unit {

    PROBE    (null),
    STALKER  ({"cybernetics core"});

    private final String[] require;

    Unit(String[] require) {
        this.require  = require;
    }

    public String[] require() { return require; }
}

На этот раз в приведенном выше примере я пытаюсь передать конструктору значение одного элемента массива. Я понимаю, что могу указать массив для хранения этого значения, например. String[] stalker = {"cybernetics core"};, но, учитывая, что в моем полном проекте мне нужно вводить здесь различные значения массива, я искал более элегантный способ. Здесь?

1
user2849447 5 Мар 2014 в 18:06

3 ответа

Лучший ответ

В дополнение к использованию конструктора массива new String[] {} вы также можете использовать varargs для вашего Enum-Constructor:

public enum Unit {

  PROBE    (),
  STALKER  ("cybernetics core");

  private final String[] requirements;

  Unit(String... requirements) {
      this.requirements  = requirements;
  }

  public String[] requirements() { return requirements; }
}

За кулисами Java создает массив для varargs, но его удобнее читать в коде. Обратите внимание, что, однако, пустой параметр приводит к пустому массиву, аналогичному new String[0]. Во многих случаях работать с пустым массивом гораздо удобнее, чем с null, поскольку вам не нужны проверки на null в вашем коде.

1
nd. 5 Мар 2014 в 14:15

Вы можете использовать обычный конструктор массива:

STALKER(new String[] { "value1", "value2" });
6
Robin Krahl 5 Мар 2014 в 14:08

Инициализация вашего массива String не будет компилироваться как таковая.

Просто замените:

STALKER  ({"cybernetics core"});

С участием

STALKER  (new String[]{"cybernetics core"});
1
Mena 5 Мар 2014 в 14:08