Есть много способов решить эту проблему. Мой предпочтительный подход - иметь интерфейсы:
public interface ICode {
/*your preferred code type here, can be int or string or whatever*/ id();
}
public interface IMessage {
ICode code();
}
Теперь вы можете определить любое количество перечислений, которые предоставляют сообщения:
public enum DatabaseMessage implements IMessage {
CONNECTION_FAILURE(DatabaseCode.CONNECTION_FAILURE, ...);
}
Теперь у вас есть несколько вариантов, чтобы превратить их в строки. Вы можете скомпилировать строки в свой код (используя аннотации или параметры конструктора перечисления) или вы можете прочитать их из файла конфигурации / свойств или из таблицы базы данных или их смеси. Последний - мой предпочтительный подход, потому что вам всегда будут нужны некоторые сообщения, которые вы можете превратить в текст очень рано (т. Е. , пока вы подключаетесь к базе данных или читаете конфигурацию).
Я использую модульные тесты и среды отражения, чтобы найти все типы, которые реализуют мои интерфейсы, чтобы убедиться, что каждый код используется где-то и что файлы конфигурации содержат все ожидаемые сообщения и т. Д.
Используя фреймворки, которые могут анализировать Java, например https://github.com/javaparser/javaparser или из Eclipse , вы даже можете проверить, где используются перечисления, и найти неиспользуемые.