Хотя я согласен с другими ответами, OP спрашивал, почему бы не иметь класс со всеми статическими методами (возможно, со статическими полями) вместо синглтона, где у вас есть один экземпляр.
Зачем использовать синглтоны?
Вы можете погуглить "синглтон", чтобы найти самые разные причины. Из JavaWorld:
Иногда уместно иметь только один экземпляр класса: оконные менеджеры, диспетчеры очереди печати и файловые системы являются прототипами. Обычно к этим типам объектов, называемым одиночными объектами, обращаются разрозненные объекты во всей программной системе, и поэтому для них требуется глобальная точка доступа. Конечно, если вы уверены, что вам никогда не понадобится больше одного экземпляра, можно поспорить, что вы передумаете.
Зачем использовать синглтон вместо класса со всеми статическими методами?
Несколько причин
- Вы можете использовать наследование
- Вы можете использовать интерфейсы
- Это упрощает модульное тестирование самого одноэлементного класса.
- Это позволяет проводить модульное тестирование кода, зависящего от синглтона.
Для # 3, если ваш синглтон был пулом соединений с базой данных, вы хотите убедиться, что ваше приложение имеет только один экземпляр, но выполнить модульное тестирование самого пула соединений с базой данных, не затрагивая базу данных (возможно, используя конструктор области пакета или статический метод создания):
public class DatabaseConnectionPool {
private static class SingletonHolder {
public static DatabaseConnectionPool instance = new DatabaseConnectionPool(
new MySqlStatementSupplier());
}
private final Supplier<Statement> statementSupplier;
private DatabaseConnectionPool(Supplier<Statement> statementSupplier) {
this.statementSupplier = statementSupplier;
}
/* Visibile for testing */
static DatabaseConnectionPool createInstanceForTest(Supplier<Statement> s) {
return new DatabaseConnectionPool(s);
}
public static DatabaseConnectionPool getInstance() {
return SingletonHolder.instance;
}
// more code here
}
(обратите внимание на использование инициализации по запросу держателя шаблон)
Затем вы можете провести тестирование DatabaseConnectionPool, используя метод createInstanceForTest в области пакета.
Обратите внимание, однако, что наличие статического getInstance() метода может вызвать «статическое цепляние», когда код, зависящий от вашего синглтона, не может быть протестирован на единицу. Статические синглтоны часто не считаются хорошей практикой из-за этого (см. это сообщение в блоге)
Вместо этого вы можете использовать структуру внедрения зависимостей, такую как Spring или Guice, чтобы гарантировать, что ваш класс имеет только один экземпляр в производственной среде, при этом позволяя тестировать код, использующий этот класс. Поскольку методы в синглтоне не статичны, вы можете использовать фреймворк для имитации, например JMock, для имитации своего синглтона в тестах.
person
NamshubWriter
schedule
12.02.2011