Как использовать «Статические методы фабрики» вместо конструкторов?
Эффективная Java говорит: «Рассмотрите возможность предоставления статических заводских методов вместо конструкторов»
Если у тебя есть
class A { public static A getInstance() { return new A(); } }
Имеет ли смысл предоставлять этот метод для classа A, а не называть новый код A () в коде.
- Зачем нужен метод main () в основном classе java
- Использование «this» с именем classа
- Воспроизведение музыки BG через действия в Android
- Как правильно переопределить toString () на Java?
- Как ограничить пропускную способность в Java?
- Почему методы переопределения не могут исключать исключения, кроме переопределенного метода?
- Как я могу использовать пользовательский растровый рисунок для точки «вы здесь» в MyLocationOverlay?
- Key hash для Android Android SDK
- HTTPS GET (SSL) с Android и самозаверяющим сертификатом сервера
- Несколько версий Java, работающих одновременно под Windows
- Какие языки программирования могут использоваться для разработки в Android?
- Разница между статическими и финальными?
- Неудачное обнаружение службы с использованием Bluetooth на Android
См. Здесь, чтобы получить хорошее изложение основных причин, по которым вы, возможно, захотите это сделать. В итоге:
- Именованные «конструкторы».
- При необходимости может вернуть значение null.
- Может возвращать экземпляр производного classа, если это необходимо.
- Уменьшите многословие при создании экземпляров переменных общих типов.
Другая причина приходит в голову, что статья не упоминает: может реализовать интересную логику, чтобы не создавать новые объекты все время (кеширование на основе параметров, переработка и т. Д.).
Для вашего примера выше не имеет смысла предоставлять статический конструктор. И обычно, когда вы предоставляете статический конструктор, вы должны сделать обычный конструктор закрытым. В противном случае по-прежнему можно создать экземпляр с обычным конструктором.
Я попытаюсь объяснить здесь другой пример, когда вы можете использовать статические методы фабрики. Одно из преимуществ заключается в том, что вы можете дать фабричным методам понятные имена.
class Complex { public static Complex fromCartesian(double real, double imag) { return new Complex(real, imag); } public static Complex fromPolar(double modulus, double angle) { return new Complex(modulus * cos(angle), modulus * sin(angle)); } private Complex(double a, double b) { //... } } Complex c = Complex.fromPolar(1, pi)
Или другим примером может служить шаблон Singleton . Там вы не будете предоставлять только один экземпляр. Вот почему вы делаете конструктор закрытым и создаете собственный метод getInstance, где вы убедитесь, что всегда доступен только один экземпляр.
public class Singleton { private volatile static Singleton singleton; private Singleton() { } // synchronized keyword has been removed from here public static Singleton getSingleton() { if(singleton==null) { synchronized(Singleton.class){ if(singleton == null) { singleton = new Singleton(); } } } return singleton; } }
Заводской шаблон метода Википедия
Шаблон Singleton со статическими вызовами методов является лучшим дизайном, если ур ищет один экземпляр .. из-за реентерабельности блокировки статики. Обеспечение безопасности streamов, а также избежание записи из-за порядка.