Слава за то, что показал мне ошибку компилятора, которую я никогда раньше не видел.При компиляции исходного файла, сгенерированного:
public static void main(String[] args) throws Exception {
PrintWriter w = new PrintWriter("C:\\test.java");
w.println("enum Test {");
for (int i = 0; i < 3000; i++) {
w.println("c" + i + ",");
}
w.println("}");
w.close();
}
eclipse говорит
Код для статического инициализатора превышает ограничение 65535 байт
То жетест с использованием всего лишь 2000 констант компилируется без ошибок.
Конечно, если у вас столько констант, было бы неплохо организовать их в несколько исходных файлов.
Да, один(и только один) объект выделяется для каждой константы перечисления.С 2000 константами это колоссальные 16 КБ памяти :-) (на 32-битной виртуальной машине Sun другие виртуальные машины могут немного отличаться)
Каждая константа перечисления является объектом, и у каждой из них есть поле text
,Поле не является окончательным и, следовательно, не подлежит встраиванию.Да, доступ к полям имеет постоянное время.
Однако в общем случае странно иметь изменяемое состояние в перечислении.Однако это возможно.
Хорошие подходы включают:
Делегирование в ResourceBundle, как показывает AlexR.Недостаток: вы должны вручную управлять файлами ресурсов.Если вы сделаете это, я рекомендую UnitTest для обнаружения опечаток / пропущенных / лишних ключей ресурсов или даже утилиту командной строки, чтобы добавить недостающие ключи в файл ресурсов, чтобы вам не пришлось (неправильно) вводить их.
Если вы поддерживаете только несколько языков, вы можете в качестве альтернативы сохранить все языки в перечислении:
enum Message {
Hello("Hello", "Hallo", "Salut");
String en;
String de;
String fr;
Message(String en, String de, String fr) {
this.en = en;
this.fr = fr;
this.it = it;
}
Недостатки: редактирование не выполняется мирянами (необходим компилятор), а кодировка исходного файла лучшеподдерживать все специальные символы на целевом языке (экранирование Юникода неудобно ...).Кроме того, исходный файл загромождается, если у вас более 3 или 4 языков.
Преимущества: добавление / удаление текстов выполняется очень быстро, и компилятор ловит все опечатки в имени текста и "ресурс"file "всегда согласован.
В любом случае, вы должны использовать MessageFormat
, как объясняет учебник, на который ссылается R.Bemrose в своем ответе.
И, наконец, при работе с Enums вы можете найтиудобный метод values ():
for (Text t : Text.values()) {
}