Производительность статических инициализаторов почти не имеет значения (особенно для такой тривиальной инициализации), поскольку это делается только один раз для класса.
2) Этот конкретный методный подход является избыточным, потому что он вызывается немедленнокогда класс инициализируется;sdf
равно всегда null, когда статический инициализатор вызывает этот метод, и вы больше не вызываете этот метод (по крайней мере, не для того, чтобы дать sdf
другое значение).Это также довольно странно, потому что вы намеренно читаете неинициализированное последнее поле.
Итак, просто удалите условное выражение, и в результате вы получите эффективный подход встроенного инициализатора с косвенным обращением к вызову метода.
Подход с использованием метода будет полезен, если, скажем, выхотел выполнить другую настройку на устройстве форматирования, например, установить часовой пояс.
3) Не инициализировать статические члены в конструкторе.Конструкторы предназначены для инициализации элементов экземпляра.
В частности, для этого необходимо, чтобы статическое поле не было финальным.Это означает, что вам придется беспокоиться о видимости обновлений поля, чтобы избежать нескольких потоков, инициализирующих поле, поскольку они видят нулевое значение
4) Инициализация поля при его объявлении - это просто сокращение дляобъявив статический инициализатор.Первый кодовый блок в вопросе семантически идентичен следующему:
private static final ComplexObject sdf;
static {
sdf = new ComplexObject();
}
Нет явного преимущества в этом, если вы можете обойтись без.
Статические инициализаторы являются sort-как анонимные методы.Внутренние практики Google по Java рекомендуют использовать методы вместо явных статических блоков инициализатора, где это возможно, отчасти потому, что вы можете явно вызывать их для тестов, а также потому, что они обязательно заставляют вас инициализировать только одно поле.(Я в значительной степени согласен, что это хороший совет, но учтите, что вы теряете определенную проверку присваивания в методах - как показано выше - которые могут помочь в обнаружении определенных типов ошибок).
В заключение: используйте private static final ComplexObject sdf = new ComplexObject();
, потому чтовам не нужно ничего более сложного.
Гораздо большая проблема здесь заключается в правильности, а именно в том, что sdf
не разделен между потоками: до того, как вы отредактировали вопрос, sdf
был SimpleDateFormat
, который не является потокобезопасным.Я понятия не имею, что такое ComplexObject
, но вы должны убедиться, что он потокобезопасен или что он доступен потокобезопасным способом.Беспокойство о таких вещах до микрооптимизаций.