2014-01-24 2 views
5

Мы можем воспроизвести поведение Singleton, создав класс со статическими методами и элементами-членами. Помимо сериализации В чем вред для внедрения singleton с использованием только статического тела.Синглтон с использованием статических членов и методов?

+1

Я не нашел ответа в этой теме. Я считаю, что в другой ветке есть недостатки синглтона. Я спрашиваю, почему мы не можем заменить внедренную в commin реализацию статическим телом. –

+0

Спасибо Kapep. Это выглядит хорошо. –

ответ

4

Вы не можете использовать этот шаблон для реализации провайдера для некоторого интерфейса или для обеспечения подкласса или другого альтернативного поведения. Это означает, что тестирование становится более сложным, и вы не можете использовать инъекцию зависимостей для чего-либо, что делает ваш статический класс.

+1

Спасибо. Понял. Я считаю, что неспособность участвовать в Runetime Polymorphism является основной причиной, по которой мы никогда не используем эту реализацию. Отлично. Еще раз спасибо. –

+0

и я считаю, что это связано с тем, что мы не можем переопределять статические методы. Отлично. Я знал, что есть несколько других вещей, таких как сериализация, ленивая загрузка и т. Д., Но мне не хватало этой очень важной причины. –

4

A Singleton - это единственный экземпляр класса (то есть один объект). Блок статического кода не является объектом. Это всего лишь код.

Кажется, существует определенная разница между этим:

public class MyClass { 
    public static void doIt() { 
    System.out.println("doIt()"); 
    } 
} 

И это:

public class MySingleton { 
    private static MySingleton _singleton = null; 
    private String cantTouchThis; 
    private MySingleton() { 
    cantTouchThis = "Hands off, static block!"; 
    } 
    public static MySingleton newInstance() { 
    if (_singleton == null) { 
     _singleton = new MySingleton(); 
    } 
    return _singleton; 
    } 
} 

В первом случае, в основном все у вас есть блок кода, который вы можете выполнить с помощью вызова MyClass.doIt(). Во втором случае, вызывая MySingleton.newInstance(), вы можете получить доступ к объекту честности и добра.

НТН

1

Akwardness or hoop-jumping to unit test такой «синглтон» является один потенциальный недостаток в дополнение к сериализации.

Сравните это с unit testing a true (i.e. instantiable) singleton.

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

Смежные вопросы