final static автоматически использует ленивую реализацию? - PullRequest
0 голосов
/ 11 мая 2011

на странице http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html?page=5 написано, что код такой:

public final static Singleton INSTANCE = new Singleton();

автоматически использует ленивый экземпляр.

Я хочу проверить, если

1) все компиляторы делают это, или же компилятор может делать все, что пожелает

2) и поскольку в c # нет ключевого слова "final", как лучше всего перевести это в c # (и в то же время оно должно автоматически использовать ленивую реализацию)

1 Ответ

3 голосов
/ 11 мая 2011

Да. Статический инициализатор гарантированно запустится до того, как вы сможете получить доступ к этому INSTANCE. У этого подхода есть два недостатка:

  1. Если в конструкции Singleton возникает ошибка, то ее немного сложнее отладить («Ошибка в инициализаторе»).
  2. При первом использовании класса этот объект будет создан. Если вы применили блокировку, то она не будет реализована, пока не понадобится. Однако, учитывая, что данный пример является синглтоном, это не проблема вообще , но это может быть перетаскивание неиспользуемого, но ленивого экземпляра кода в другом месте, которое не синглтон.

Перевод для C # readonly вместо final.

По моему мнению, это все еще намного предпочтительнее вторичного подхода (синхронизированный / заблокированный, проверенный экземпляр в статическом геттере), потому что он не требует никакого кода синхронизации, который быстрее, проще для чтения и так же легко использовать.

...