Эта статья, о сравнении паттерна синглтон со статическим классом (такой класс, в котором все методы - статические) поднимает интересные вопросы, пропущенные автором в записи блога "Вопросы для интервью о паттерне синглтон в Java". Так как оба, и паттерн синглтон, и статический класс обеспечивают хороший доступ, а также имеют общие черты, например оба могут быть использованы без создания объекта и оба создают только один экземпляр. Это очень похоже на то, будто они оба предназначены для решения одной и той же задачи. Из-за высокого уровня сходства, интервьюеры обычно задают вопрос "Почему вы чаще используете паттерн синглтон вместо статических методов?" или "Вы можете заменить паттерн синглтон статическим классом, и какая вообще между ними разница?" Для ответа на данный вопрос, важно помнить фундаментальные различия между этими двумя подходами, первый дает нам Объект, для которого позже просто предоставляет статичные методы. Так как объект всегда емче метода, это может помочь вам разобраться, когда использовать паттерн синглтон, а когда статические методы. В этой статье о Java мы изучим, где в Java использовать паттерн синглтон, а где лучшим вариантом будет статический класс. Кстати, в JDK есть примеры обоих способов, и это тоже очень грамотно, например java.lang.Math является завершенным классом полным статических методов, с другой стороны, java.lang.Runtime является в Java классом-синглтоном. Для тех, кто незнаком со строением синглтона или статического класса: статический класс в Java - это класс, который содержит только статические методы. Хорошим примером статического класса является java.lang.Math, который содержит большое количество вспомогательных методов для разнообразных математических функций, например sqrt(). В то время как синглтон-классами являются те, которые имеют только один экземпляр во время жизненного цикла приложения, как в java.lang.Runtime.
Когда же использовать статический класс вместо синглтона
Разница в Java между паттерном синглтон и статическими классами. - 1Действительно, есть некоторые ситуации, когда использование статического класса имеет больший смысл, чем использование синглтона. Лучшим примером этого является java.lang.Math, который не является синглтоном, взамен класса со всеми статическими методами. Вот несколько ситуаций когда, я думаю, осмысленней использовать статический класс вместо синглтона: 1) Если Ваш синглтон не поддерживает ни одного состояния, а просто обеспечивает доступ к методам, лучше рассмотреть использование статического класса, так как статические методы гораздо быстрее синглтона, благодаря статичному связыванию во время компиляции. Но помните, не рекомендуется поддерживать состояние внутри статического класса, особенно в распаралелленой среде, где это может нарушить тонкие условия гонки, когда несколько параллельных потоков изменяются без адекватной синхронизации. Также вы можете выбрать статический метод, если вам нужно объединить кучу вспомогательных методов вместе. Во всех остальных случаях, когда требуется свободный доступ к некоторому ресурсу, нужно использовать синглтон.
Разница между синглтоном и статическими классами.
Это ответ на наш второй вопрос с интервью о сравнении синглтона со статическими классами. Как я ранее сказал, основная разница между ними состоит в том, что один из них представляет собой объект, в то время как другой представляет собой метод. Вот еще несколько различий в Java между статическими классами и синглтоном: 1) Статический класс предоставляет большую производительность, чем синглтон, потому что статические методы связываются во время компиляции. 2) Еще одно различие между синглтоном и статическими классами состоит в возможности переопределения. Статические методы в Java не могут быть переопределены, это приводит к потере гибкости. С другой стороны, вы можете переопределить 09.06.13 методы определенные в синглтон-классе, путем расширения этого класса. 3) Статические классы тяжело копировать и следовательно, тяжело тестировать, в отличии от синглтона, который прелестно легко копируется и также легко тестируется. Легче написать тест JUnit для Синглтона, чем для статических классов, потому что вы можете передавать макет объекта синглтона всякий раз, когда это ожидается, например в конструкторе или как аргументы методов. 4) Если по Вашим требованиям необходимо поддержать состояние, то в таком случае синглтон является лучшим выбором, чем статический класс, потому что поддержание состояния в последнем случае - кошмар, и ведет к неочевидным ошибкам. 5) Синглтон классы могут медленно загружаться, если они являются тяжелыми объектами. В то же время статические классы не имеют многих преимуществ синглтона, зато всегда загружаются немедленно. 6) Многие фреймворки с внедрением зависимостей, например Spring, достаточно хорошо управляют синглтонами, что делает их использование очень легким. Некоторые из этих различий между статическими классами и синглтоном, могут помочь сделать правильный выбор в зависимости от ситуации. В следующем разделе мы будем выбирать, когда в Java использовать синглтон вместо статических классов.
Преимущества синглтона над статическим классом.
Главное преимущество синглтона над статическими классами является то, что первый является более объектно-ориентированным, чем последний. С синглтоном можно использовать наследование и полиморфизм для расширения основных классов, реализовать интерфейс и возможно обеспечить разные реализации. Если мы говорим про java.lang.Runtime, который является в Java синглтоном, вызов метода getRuntime() вернет разные реализации, основанные на разных JVM, но гарантируют только один экземпляр в одной JVM, имеющей статический класс java.lang.Runtime, то при этом невозможно вернуть разные реализации для разных JVM. Всё это - различия в Java между синглтоном и статическим классом. Если вам нужен класс с полной объектно-ориентированной совместимостью, выберите синглтон, а если вам нужно просто хранить кучу статических методов вместе, тогда используйте статические классы. Оригинальная статья: Difference between Singleton Pattern vs Static Class in Java Пола Джавина (Javin Paul) Переведено: argnist