newInstance()
jest często stosowane jako sposób na instancję obiektu bez bezpośredniego wywoływania konstruktora domyślnego obiektu. Na przykład, jest często używany do wdrożenia Pattern Design 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;
}
}
w tym przypadku programista zmusza klienta, aby zadzwonić newInstance()
pobrać instancję klasy. Jest to ważne, ponieważ samo dostarczenie domyślnego konstruktora umożliwiłoby klientowi dostęp do wielu wystąpień klasy (co jest sprzeczne z właściwością Singleton).
W przypadku Fragment
s dostarczenie statycznej metody fabrycznej newInstance()
jest dobrą praktyką, ponieważ często chcemy dodać argumenty inicjujące do nowo utworzonego obiektu. Zamiast tego, aby klient wywoływał domyślny konstruktor i ręcznie ustawiał argumenty fragmentów, możemy podać metodę newInstance()
, która robi to za nich. Na przykład,
public static MyFragment newInstance(int index) {
MyFragment f = new MyFragment();
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
Ogólnie rzecz biorąc, podczas gdy różnica między nimi jest głównie tylko kwestia projektu, ta różnica jest bardzo ważne, ponieważ zapewnia kolejny poziom abstrakcji i sprawia, że kod o wiele łatwiejsze do zrozumienia.
Powszechnie, A.newInstance jest używany do pojedynczego wzoru projektowego. –