Throwables
Если у вас есть фактический Throwable
экземпляр, Google Guava предоставляет Throwables.getStackTraceAsString()
.
Пример:
String s = Throwables.getStackTraceAsString ( myException ) ;
Для таких довольно тривиальных вещей я обычно использую перечисление. Я могу отождествить себя с вами в том смысле, что считаю это не совсем правильным ... но, на мой взгляд, это меньшее из двух зол.
Некоторое дополнительное оправдание для этого: если по какой-то причине было добавлено четвертое значение, ваш код в любом случае потребует обновления, чтобы иметь возможность справиться с этим. Пока вы это делаете, очень легко также обновить перечисление.
В случае, если вам нужно добавить новое значение в таблицу, потребует ли это изменение кодировки в вашем приложении для поддержки этого нового значения? Если это так, сделайте его перечислением
.
В зависимости от вашей базы данных вы можете сделать поле видимости нумерованным типом. Таким образом, данные должны быть одним из параметров, которые вы указали при создании таблицы.
Если вам нужно выполнить код ветвления в вашем приложении на основе значений в этой таблице, вы захотите представить эту таблицу в виде перечисления. Если нет, то можно сделать просто еще один класс.
Вот здесь-то и пригодится генерация кода - если вы используете что-то, что может генерировать таблицу в качестве перечисления, вам не придется думать о синхронизации таблицы и перечисления - просто добавьте свои строки в таблицу, и в следующий раз, когда вы создадите свой бизнес-уровень, перечисление обновится само.
Если у вас есть бизнес-логика, основанная на перечислении, ваш основной вариант - синхронизировать, а затем вручную. Если эти строки также являются внешними ключами для другой таблицы (скажем, у вас есть таблица поиска статусов), вам следует сделать тип идентификатора обычным int с уникальным индексом вместо идентификатора, чтобы вы могли легко поддерживать пары идентификаторов / значений то же самое, если у вас есть базы данных в разных средах.
В отличие от ответа Скотта Айви, я предпочитаю (но редко использую) подход, при котором я поддерживаю только перечисления, а при запуске приложения (или, возможно, при событии сборки) использую Reflection, чтобы убедиться, что значения таблицы совпадают с моими значениями перечислений. Это не требует генерации кода, но подвержено позднему обнаружению нарушений ограничений на ссылки.
.