В чем разница между "new A ()" и "A.newInstance ()"? - PullRequest
13 голосов
/ 17 января 2012

Когда я должен предпочесть одно другому?Какова цель метода, показанного ниже?

class A {
    public static A newInstance() {
        A a = new A();
        return a ;
    }
}

Может ли кто-нибудь объяснить мне разницу между этими двумя вызовами?

Ответы [ 3 ]

16 голосов
/ 17 января 2012

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

public class Singleton {
    private static final Singleton instance = null;

    // make the class private to prevent direct instantiation.
    // this forces clients to call newInstance(), which will
    // ensure the class' Singleton property.
    private Singleton() { } 

    public static Singleton newInstance() {
        // if instance is null, then instantiate the object by calling
        // the default constructor (this is ok since we are calling it from 
        // within the class)
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

В этом случае программист заставляет клиента вызвать newInstance(), чтобы получить экземпляр класса. Это важно, поскольку простое предоставление конструктора по умолчанию позволило бы клиенту получить доступ к нескольким экземплярам класса (что противоречит свойству Singleton).

В случае Fragment s предоставление статического фабричного метода newInstance() является хорошей практикой, так как мы часто хотим добавить аргументы инициализации для вновь созданного объекта. Вместо того, чтобы клиент вызывал конструктор по умолчанию и вручную устанавливал аргументы фрагмента, мы можем предоставить метод newInstance(), который делает это для них. Например,

public static MyFragment newInstance(int index) {
    MyFragment f = new MyFragment();
    Bundle args = new Bundle();
    args.putInt("index", index);
    f.setArguments(args);
    return f;
}

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

1 голос
/ 17 января 2012

В ваших примерах они эквивалентны, и нет никакой реальной причины выбирать один над другим. Тем не менее, использование newInstance обычно используется, если выполнить некоторую инициализацию перед передачей экземпляра класса. Если каждый раз, когда вы запрашиваете новый экземпляр класса, вызывая его конструктор, вы заканчиваете тем, что устанавливаете кучу переменных экземпляра, прежде чем сможете использовать объект, тогда было бы более целесообразно, чтобы метод newInstance выполнил эту инициализацию и вернулся к вам. объект, который готов к использованию.

Например, Activity s и Fragment s не инициализируются в своих конструкторах. Вместо этого они обычно инициализируются во время onCreate. Поэтому для метода newInstance принято принимать любые параметры, которые объект должен будет использовать во время инициализации, и он сохраняет их в Bundle, который объект может прочитать позже. Пример этого можно увидеть здесь:

Пример класса с newInstance методом

0 голосов
/ 28 августа 2016

new() - это ключевое слово, используемое для создания объекта, и его можно использовать, пока мы знаем имя класса.
new instance () Это метод, используемый для создания объекта, и его можно использовать, когда мы не знаем,о названии класса

...