Как сохранить постоянный массив строки в java

Я выбираю случайным образом из набора конкретных строк в моем приложении. Я храню эти данные в коде напрямую. Насколько я знаю, вы не можете объявить public static final String[] = {"aa", "bb"}. Поэтому, хотя перечисление было бы полезно, что отлично работает с именами с одним словом:

public enum NAMES {
  Mike, Peter, Tom, Andy
}

Но как хранить такие предложения? Здесь перечисление не выполняется:

public enum SECRETS {
  "George Tupou V, the King of Tonga, dies in Hong Kong at the age of 63.", 
  "Joachim Gauck is elected President of Germany.",
  "Lindsey Vonn and Marcel Hirscher win the Alpine Skiing World Cup.";
}

Что еще я должен использовать? Или я неправильно использую перечисление?

Ответ 1

public enum Secret
{
    TONGA("George Tupou V, the King of Tonga, dies in Hong Kong at the age of 63."), 
    GERMANY("Joachim Gauck is elected President of Germany."),
    SKIING("Lindsey Vonn and Marcel Hirscher win the Alpine Skiing World Cup.");

    private final String message;

    private Secret(String message)
    {
        this.message = message;
    }

    public String getMessage()
    {
        return this.message;
    }
}

Ответ 2

Вы можете сделать

public static final String[] = {"aa", "bb"};

вам просто нужно указать имя поля:

public static final String[] STRINGS = {"aa", "bb"};

РЕДАКТИРОВАТЬ: Я второй Jon Skeet ответил, что это плохая практика кода. Затем кто-то может изменить содержимое вашего массива. Что вы можете сделать, так это объявить его приватным и указать getter для массива. Вы сохраните индексный доступ и предотвратите случайную запись:

private static final String[] STRINGS = {"aa", "bb"};

public static String getString(int index){
    return STRINGS[index];
}

Я думаю, вам понадобится метод для получения длины массива:

public static int stringCount(){
    return STRINGS.length;
}

Но пока ваш проект невелик, и вы знаете, что делаете, вы будете в полном порядке, оставив его открытым.

Ответ 3

Вы не можете создать неизменяемый массив, в основном. Ближе всего вы можете создать неизменяемую коллекцию, например. с Guava.

public static final ImmutableList<String> SECRETS = ImmutableList.of(
    "George Tupou V, the King of Tonga, dies in Hong Kong at the age of 63.", 
    "Joachim Gauck is elected President of Germany.",
    "Lindsey Vonn and Marcel Hirscher win the Alpine Skiing World Cup.");

Вы можете использовать enum, указав каждому значению перечисления соответствующую строку, например:

public enum Secret {
    SECRET_0("George..."),
    SECRET_1("Joachim..."),
    SECRET_2("Lindsey...");

    private final String text;

    private Secret(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

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

ИЗМЕНИТЬ: Как отмечено в другом ответе, это совершенно верно:

public static final String[] FOO = {"aa", "bb"};

... предполагая, что это не во внутреннем классе (о котором вы не упоминали нигде в своем вопросе). Однако это очень плохая идея, поскольку массивы всегда изменяемы. Это не "постоянный" массив; ссылка не может быть изменена, но другой код может написать:

WhateverYourTypeIs.FOO[0] = "some other value";

... который, как я подозреваю, вам не нужен.

Ответ 4

public enum NAMES {

  Mike("Mike Smith"),
  Peter("Peter Jones"),
  Tom("Thomas White"),
  Andy("Andrew Chu");

  private final String fullname;

  private NAMES(String value)
  {
    fullname = value;
  }
};

Ответ 5

Вставьте выбранные предложения в Set<String>, а затем используйте возвращаемое значение Collections.unmodifiableSet(). Пример:

final Set<String> mutableSentences = new HashSet<>();
/* ... */
final Set<String> sentences = Collections.unmodifiableSet(mutableSentences);