Создание ссылки на «это» в единственном существующем конструкторе класса - PullRequest
0 голосов
/ 01 июля 2019

Мой друг показал мне это как свою реализацию шаблона синглтона.Кажется, работает нормально, из того, что я тестировал до сих пор.Я не могу сказать, почему, но ссылка на «это», как показано ниже, просто кажется мне плохой практикой.

Допустимо ли использование этого слова в конструкторе?

public class Singleton {
    private static Singleton unique = null;

    private Singleton() { unique = this; }

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

Там даже существенная разница, по сравнению с обычным способом:

public class Singleton {
    private static Singleton unique = null;

    private Singleton() { }

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

Я не смог найти разумных ответов на мои вопросы.

Итак, заранее спасибо!

1 Ответ

0 голосов
/ 01 июля 2019

Допустимо ли использование этого слова в конструкторе?

Это будет работать, но неразумно и едва читаемо. Это больше похоже на запах кода.

Есть ли даже существенная разница по сравнению с обычным способом?

Читаемость и ремонтопригодность всегда должны учитываться. Будет сложнее издеваться и / или использовать этот синглтон, потому что его реализация имеет вид unique .

Также, как указано в комментариях. Ни один из примеров не является поточно-ориентированным. Означает, что это не true singleton.

Если вам нужен потокобезопасный синглтон с отложенной инициализацией, я бы предложил реализовать его следующим образом:

public class Singleton {

private static Singleton unique = null;

private Singleton() {
}

public static synchronized Singleton getInstance() {
    if (unique == null) {
        unique = new Singleton();
    }
    return unique;
}
}

Вы можете улучшить его, введя двойную проверку блокировки:

public static synchronized Singleton getInstance() {
    if (unique == null) {
        synchronized (Singleton.class) {
            if (unique == null) {  
                unique = new Singleton();
            }
        }
    }
    return unique;
}

Дополнительная информация

Существует несколько способов реализации шаблона Singleton:

https://www.geeksforgeeks.org/java-singleton-design-pattern-practices-examples/

...