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