Подтвердить что ты не робот

Как использовать "Static factory методы" вместо конструкторов?

Эффективный java говорит "Рассмотрите возможность предоставления статических factory методов вместо конструкторов"

Если у вас есть

 class A {

     public static A getInstance() {
        return new A();
     }
 }

Имеет ли смысл предоставлять этот метод для класса A, а не вызывать новый код A() в коде.

4b9b3361

Ответ 1

Смотрите здесь для приятного изложения основных причин, по которым вы, возможно, захотите это сделать. Вкратце:

  • Именованные "конструкторы".
  • Может возвращать нуль, если это необходимо.
  • Может возвращать экземпляр производного класса, если это необходимо.
  • Уменьшить многословие при копировании переменных общих типов.

Другая причина заключается в том, что статья не упоминает: может реализовать интересную логику, чтобы не создавать новые объекты все время (кеширование на основе параметров, переработка и т.д.).

Ответ 2

Для вашего примера выше не имеет смысла предоставлять статический конструктор. И обычно, когда вы предоставляете статический конструктор, вы должны сделать обычный конструктор закрытым. В противном случае все еще возможно создать экземпляр с обычным конструктором.

Я попытаюсь объяснить здесь другой пример, когда вы можете использовать статические методы factory. Одно из преимуществ заключается в том, что вы можете дать понятным именам методы factory.

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 Pattern. Там вы не будете предоставлять только один экземпляр. Вот почему вы делаете конструктор закрытым и создаете собственный метод 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;
    }

}

Factory Шаблон метода Википедия

Ответ 3

Шаблон Singleton со статическими вызовами методов является лучшим дизайном, если ур ищет один экземпляр.. из-за реентерабельности блокировки статики. Обеспечение безопасности потока, а также исключение записи из-за порядка.