Ответ 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;
}
В целом, в то время как разница между ними в основном является вопросом дизайна, эта разница действительно важна, поскольку она обеспечивает еще один уровень абстракции и делает код намного понятнее.