Да. Статический инициализатор гарантированно запустится до того, как вы сможете получить доступ к этому INSTANCE
. У этого подхода есть два недостатка:
- Если в конструкции Singleton возникает ошибка, то ее немного сложнее отладить («Ошибка в инициализаторе»).
- При первом использовании класса этот объект будет создан. Если вы применили блокировку, то она не будет реализована, пока не понадобится. Однако, учитывая, что данный пример является синглтоном, это не проблема вообще , но это может быть перетаскивание неиспользуемого, но ленивого экземпляра кода в другом месте, которое не синглтон.
Перевод для C # readonly
вместо final
.
По моему мнению, это все еще намного предпочтительнее вторичного подхода (синхронизированный / заблокированный, проверенный экземпляр в статическом геттере), потому что он не требует никакого кода синхронизации, который быстрее, проще для чтения и так же легко использовать.