Мы можем воспроизвести поведение Singleton, создав класс со статическими методами и элементами-членами. Помимо сериализации В чем вред для внедрения singleton с использованием только статического тела.Синглтон с использованием статических членов и методов?
ответ
Вы не можете использовать этот шаблон для реализации провайдера для некоторого интерфейса или для обеспечения подкласса или другого альтернативного поведения. Это означает, что тестирование становится более сложным, и вы не можете использовать инъекцию зависимостей для чего-либо, что делает ваш статический класс.
Спасибо. Понял. Я считаю, что неспособность участвовать в Runetime Polymorphism является основной причиной, по которой мы никогда не используем эту реализацию. Отлично. Еще раз спасибо. –
и я считаю, что это связано с тем, что мы не можем переопределять статические методы. Отлично. Я знал, что есть несколько других вещей, таких как сериализация, ленивая загрузка и т. Д., Но мне не хватало этой очень важной причины. –
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(), вы можете получить доступ к объекту честности и добра.
НТН
Akwardness or hoop-jumping to unit test такой «синглтон» является один потенциальный недостаток в дополнение к сериализации.
Сравните это с unit testing a true (i.e. instantiable) singleton.
В конечном счете, одноэлементно гарантирует единый экземпляр класса, в то время как статический класс не инстанциируемый, как @JStevenPerry указывает (и я надеюсь, что вы уже понимаете): двое просто не то же самое, хотя они могут в так же можно использовать много способов.
- 1. Зачем использовать синглтон вместо статических методов?
- 2. с использованием псевдонима для статических функций-членов?
- 3. Service Locator с использованием статических методов
- 4. Вызов функций статических членов
- 5. Проблема с использованием пространства имен и статических методов
- 6. Порядок статических членов класса
- 7. Учитывая синглтон: потребность в статических методах и варнах?
- 8. пространства имен и частных статических классов членов
- 9. полиморфизм и наследование статических членов в C++
- 10. C# отражение и наследование статических членов
- 11. Локальные переменные статических функций-членов
- 12. Использование статических методов или статических методов в классе Dao?
- 13. Кодекс Метрики - количество статических классов и методов
- 14. Наследование статических членов в PHP
- 15. Сохранение состояния приложения с использованием только статических переменных и статических методов в классе
- 16. Функции против статических методов
- 17. C++ несколько экземпляров статических членов
- 18. PHP: Расширение статических массивов членов
- 19. Переопределение статических методов
- 20. синхронизированные блоки для статических и нестатических методов
- 21. Каковы недостатки статических методов?
- 22. Gmock для статических методов
- 23. Определение статических членов в C++
- 24. C#: Inheretence статических методов
- 25. Наследование статических методов
- 26. Enums, Какая польза от статических методов и методов интерфейса?
- 27. Java - синхронизация статических методов
- 28. Использование личных статических методов
- 29. Swift - Перегрузка статических методов
- 30. Использование андроидных статических методов
Я не нашел ответа в этой теме. Я считаю, что в другой ветке есть недостатки синглтона. Я спрашиваю, почему мы не можем заменить внедренную в commin реализацию статическим телом. –
Спасибо Kapep. Это выглядит хорошо. –