Как сохранить постоянный массив строк в Java - PullRequest
10 голосов
/ 20 марта 2012

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

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.";
}

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

Ответы [ 5 ]

20 голосов
/ 20 марта 2012

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

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

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

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

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

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

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

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

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

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

6 голосов
/ 20 марта 2012
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;
    }
}
6 голосов
/ 20 марта 2012

Вы не можете создать неизменный массив, в принципе.Самое близкое, что вы можете сделать, - это создать неизменную коллекцию, например, с Гуава .

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";

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

0 голосов
/ 20 марта 2012

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

final Set<String> mutableSentences = new HashSet<>();
/* ... */
final Set<String> sentences = Collections.unmodifiableSet(mutableSentences);
0 голосов
/ 20 марта 2012
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;
  }
};
...