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

В чем разница между "новыми A()" и "A.newInstance()"?

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

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

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

4b9b3361

Ответ 1

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 предоставление статического метода factory 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;
}

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

Ответ 2

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

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

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

Ответ 3

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