Сделать красиво?
Никакого противоречия. Преимущество ленивой инициализации полей - быстродействие. Поля инициализируются по мере необходимости. Инициализаторы полей по сути - простые операции, не связанные между собой. Недостаток недетерминированного вызова конструктора - это метод с логикой, а "фиг знает когда происходящая" логика опасна. Если ты в всё предусмотрел, то твой коллега не знает особенностей и засунет в существующий статический конструктор какой-нибудь код с побочными эффектами и гейзенбагами.
И недетерминированность тут всё же немного разная. Для поля она более-менее предсказуемая. Перед первым использованием конкретного поля оно будет инициализировано. А вот с конструктором уже сложнее - или какое-то поле используется, или объект класса (если класс не статический) создаётся. Намного больше "недетерминированности".
Можно, конечно, возразить, что и в инициализаторы полей легко запихать много логики, а в конструкторе просто
по порядку поля инициализировать. Но это уже философские вопросы.
А если говорить в целом, то и статические конструкторы, и статические инициализаторы - зло. Надо избегать статических состояний всеми силами. Всякие синглтоны и иже с ними. Уж сколько копий поломано в борьбе с багами, которые не дебажатся и не репродуцируются на девелоперских машинах, а народ всё равно туда лезет.