newInstance()
è spesso usato come un modo per creare un'istanza di un oggetto senza chiamare direttamente costruttore di default dell'oggetto. Ad esempio, è spesso utilizzato per implementare un design pattern 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;
}
}
In questo caso, il programmatore costringe il cliente a chiamare newInstance()
per recuperare un'istanza della classe. Questo è importante perché la semplice fornitura di un costruttore predefinito consente al client di accedere a più istanze della classe (che va contro la proprietà Singleton).
Nel caso di Fragment
s, fornire un metodo di produzione statico newInstance()
è una buona pratica poiché spesso si desidera aggiungere argomenti di inizializzazione all'oggetto appena istanziato. Piuttosto che avere il client chiama il costruttore predefinito e imposta manualmente gli argomenti del frammento, possiamo fornire un metodo newInstance()
che faccia questo per loro. Ad esempio,
public static MyFragment newInstance(int index) {
MyFragment f = new MyFragment();
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
Nel complesso, mentre la differenza tra i due è per lo più solo una questione di progettazione, questa differenza è molto importante perché fornisce un ulteriore livello di astrazione e rende il codice molto più facile da capire.
fonte
2012-01-17 04:03:54
Comunemente, A.newInstance viene utilizzato per il modello di disegno singleton. –