2012-01-17 12 views
13

Kiedy powinienem preferować jeden nad drugim? Jaki jest cel metody pokazanej poniżej?Jaka jest różnica między "nowymi A()" i "A.newInstance()"?

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

Czy ktoś może mi wyjaśnić różnice między tymi dwoma połączeniami?

+1

Powszechnie, A.newInstance jest używany do pojedynczego wzoru projektowego. –

Odpowiedz

16

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.

+0

Świetnie, to sprawia, że ​​myślę łatwiej, bardzo dziękuję – rex

+0

Hm, ale czy nie mógłbyś owijać tego samego kodu w konstruktorze? 'public class MyFragment { MyFragment (Bundle args) {this.setArguments (args) ...} MyFragment (int index) {Bundle args = new Bundle(); args.putInt (...); this (args)} ' – Karsten

+0

próbujesz zmienić referencję ostatniej zmiennej" instancja ", jej błąd, prawda? –

1

W swoich przykładach są one równoważne i nie ma prawdziwego powodu, aby wybrać jeden nad drugim. Jednak użycie newInstance jest często używane, jeśli wykonujemy inicjalizację przed przekazaniem instancji klasy. Jeśli za każdym razem, gdy poprosisz o nową instancję klasy, wywołując jej konstruktor, skończysz ustawiać kilka zmiennych instancji, zanim będziesz mógł użyć obiektu, wtedy bardziej sensownym byłoby, gdyby metoda newInstance wykonywała tę inicjalizację i wracała do ciebie obiekt gotowy do użycia.

Na przykład Activity s oraz Fragment s nie są inicjowane w swoich konstruktorach. Zamiast tego są zwykle inicjalizowane podczas onCreate. Dlatego powszechną praktyką w metodzie newInstance jest akceptowanie wszelkich parametrów, których obiekt będzie musiał użyć podczas inicjowania, i przechowuje je w pakiecie, który obiekt może odczytać później. Przykładem tego może być postrzegane tutaj:

Sample class with newInstance method

0

new() to słowo kluczowe używane do tworzenia obiektu i może być używany podczas znamy nazwę klasy
new instance() to metoda używana do tworzenia obiektu i może być stosowane, gdy nie wiemy o nazwie klasy

Powiązane problemy