Зачем иметь закрытое поле для простейшей реализации синглтона? - PullRequest
0 голосов
/ 19 января 2020

В первой версии реализации в реализации Джона Скита здесь он имеет следующий код:

// Bad code! Do not use!
public sealed class Singleton
{
    private static Singleton instance = null;

    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}

Мне интересно, почему бы просто не сделать это:

public sealed class Singleton
{
  private Singleton() {}
  public static Singleton Instance = new Singleton();
}

В чем различия между двумя фрагментами?

(я знаю, что использование Lazy<T> гораздо лучшее решение)

Ответы [ 2 ]

3 голосов
/ 19 января 2020

Второй пример может быть установлен с помощью внешнего кода:

Singleton.Instance = null;

Первый не может быть, потому что у него нет установщика publi c.

Другое отличие что свойство разрешает отложенную инициализацию, т. е. Singleton запускается только при первом обращении к свойству, тогда как поле stati c вызывает создание экземпляра сразу после запуска программы.

0 голосов
/ 19 января 2020

Идея Singleton состоит в том, чтобы предотвратить возможность создания экземпляра класса более одного раза (или избегать с несколькими экземплярами сингелтона), и если вы используете второй фрагмент другие классы всегда будут иметь возможность снова установить экземпляр синглтон-класса:

Singleton.Instance = new Singleton(); 

ОБНОВЛЕНИЕ:

Я тогда не заметил, что конструктор является закрытым мы не можем установить это таким образом. В любом случае, как @JohnathanBarclay упомянул в своем ответе, что класс можно сбросить до нуля, и вы никогда не сможете установить его снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...