Статические методы или Синглтон, какой из них выбрать?
Возможный дубликат:
Разница между статическим классом и одноэлементным шаблоном?
Что лучше в Java,
реализация общедоступных статических методов, таких как
Factory.createLoginRequest()
или реализации шаблона Singleton, например
Factory.getInstance().createLoginRequest()
(Boths вернет объект Request.)
Какой из них лучше и почему?
Ответы
Ответ 1
из википедии:
Обратите внимание на различие между простым статическим экземпляром класса и синглом: хотя одноэлемент можно реализовать как статический экземпляр, он также может быть лениво построен, не требуя памяти или ресурсов до тех пор, пока это не понадобится. Другим заметным отличием является то, что статические классы-члены не могут реализовать интерфейс, если только этот интерфейс не является маркером. Поэтому, если класс должен реализовать контракт, выраженный интерфейсом, он действительно должен быть одиночным.
Ответ 2
Это зависит.
Выберите синглтоны, потому что:
- В общем, я бы сказал, что синглтон немного опрятен, потому что он позволяет выполнить некоторую инициализацию одиночного объекта в/из (private) конструктора.
- Когда будет решено, что этот объект больше не будет синглом (из-за новых идей или новых требований), его проще реорганизовать: вам просто нужно изменить все места, которые получают экземпляр, а не все вызовы к статическим методам.
Использовать статические методы, потому что:
- В конкретном случае android вы можете предпочесть статические методы для производительности - я подозреваю, что вызов статической функции может быть немного быстрее (проще оптимизировать для компилятора) по сравнению с вызовом метода на одноэлементном объекте.
Ответ 3
Это зависит. Концепция Singleton рассматривает ограничение на инициализацию объекта. Другими словами, singleton-объект должен быть экземпляром только одноэлементного класса во время выполнения. Но если вам просто нужно создать объекты некоторого семейства классов, перейдите с шаблоном метода factory.
Ответ 4
Я бы выбрал Singleton, потому что он позволяет использовать объектно-ориентированные функции Java, такие как наследование (переопределение метода), которое не будет работать для статических методов.