2012-01-17 16 views
13

どちらを優先させるべきですか?以下に示す方法の目的は何ですか?「新しいA()」と「A.newInstance()」の違いは何ですか?

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

この2つの呼び出しの違いを教えてもらえますか?

+1

一般に、A.newInstanceがシングルトンデザインパターンに使用されます。 –

答えて

16

newInstance()は、多くの場合、直接オブジェクトのデフォルトコンストラクタを呼び出さずにオブジェクトをインスタンス化するための方法として使用されています。例えば、それは多くの場合、シングルトンデザインパターンを実装するために使われます。

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の場合、静的ファクトリメソッド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; 
} 

全体的に、この差は本当に重要です。

+0

偉大な、それはより簡単に考えて、多くのおかげで – rex

+0

ええと、コンストラクタで同じコードをラップできませんでしたか? 'public class MyFragment { MyFragment(バンドル引数){this.setArguments(args)...} MyFragment(int index){バンドルargs =新しいバンドル(); args.putInt(...);この(args)} ' – Karsten

+0

あなたは最終的な変数"インスタンス "、そのエラーの参照を変更しようとしていますか? –

1

あなたの例では、それらは同等であり、一方を他方に選ぶ本当の理由はありません。ただし、newInstanceの使用は、クラスのインスタンスを返す前に初期化を実行する場合によく使用されます。コンストラクタを呼び出すことによってクラスの新しいインスタンスをリクエストするたびに、オブジェクトを使用する前にインスタンス変数の束を設定すると、newInstanceメソッドで初期化を実行して戻りますすぐに使用できるオブジェクトです。

たとえば、ActivityおよびFragmentは、コンストラクタで初期化されません。代わりに、それらは一般的にonCreate中に初期化されます。したがって、newInstanceメソッドは、初期化時にオブジェクトが使用する必要があるパラメータを受け入れ、オブジェクトを後で読み取ることができるBundleに格納するのが一般的です。この例はここで見ることができます:

Sample class with newInstance method

0

new()は、オブジェクトを作成するために使用されるキーワードであり、我々はクラス名
new instance()はオブジェクトを作成するために使用する方法であり、我々は、クラス名を知らないとき、それは使用することができます知っていながら、それを使用することができます

関連する問題