@unfapable

Когда использовать статический класс, а когда одиночку?

Кто-то говорит что использование статического класса, где методы все статические - это плохо, и вместо этого нужно использовать паттерн одиночку, но почему именно так? Какая разница и чему отдать предпочтение?
  • Вопрос задан
  • 2121 просмотр
Пригласить эксперта
Ответы на вопрос 2
zagayevskiy
@zagayevskiy
Android developer at Yandex
Если класс утилитарный, как например Math из Java, где все методы - по сути функции и не меняют внешнего состояния, то лучше статический. Как только у класса появляется состояние (в виде таких же статических полей-данных), стоит делать из него синглтон. Синглтон может реализовывать некие интерфейсы, и его можно использовать как обычный объект.
Так же синглтон легко превратить в не-синглтон(то есть класс со множеством экземпляров), если это понадобится.
Ответ написан
Комментировать
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Какие интересные вещи понаписали. Статические классы в джаве нужны потому что в джаве нет функций. В других языках функции группируются через namespace.

Разница между статическим классом и синглтоном в том что статический класс инициализируется при старте программы, а синглтон только когда идет обращение (кроме того в синглтон можно добавить метод для освобождения памяти от экземпляра).

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

enum class ProgState {Init, Run, Release};
//вариант 1
bool isLastDoc = (App::state () == ProgState::Init);
App::LoadDocument ( isLastDoc ); 
//вариант 2
bool isLastDoc = (App::getInstance () -> state () == ProgState::Init);
App::getInstance() -> LoadLastDocument( isLastDoc );


Лично мне синглтоны не нравятся getInstance по всему коду программы, а статик классы тем что надо везде писать слово static при описании класса и в cpp файле иницировать все члены класса. Поэтому я делаю так:
//app.h
App& app (); //здесь можно и статик переменую, а не функцию
//app.cpp
App & app ()
{
	static App app;
	return app;
}
//в коде
bool isLastDoc = (app() -> state () == ProgState::Init);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы