web-dev-qa-db-ja.com

newとgetInstance()の呼び出しの違い

Class.getInstance()の呼び出しはnew Class()と同等ですか?後者に対してコンストラクターが呼び出されることは知っていますが、getInstance()はどうですか?ありがとう。

14
SIr Codealot

Class#getInstance()のようなメソッドはありません。あなたはおそらくそれを Class#newInstance() と混同しているでしょう。はい、これはdefaultコンストラクターのnewとまったく同じです。これがその抜粋です Javadoc

このClassオブジェクトで表されるクラスの新しいインスタンスを作成します。 クラスは、空の引数リストを持つnew式のようにインスタンス化されます。クラスは、まだ初期化されていない場合は初期化されます。 。

コードでは、

_Object instance = Object.class.newInstance();
_

と同じです

_Object instance = new Object();
_

Class#newInstance()呼び出しは、実際には Factoryメソッド パターンに従います。


更新:他の回答を見て、あなたの質問にはあいまいさがいくつかあることに気づきました。さて、getInstance()という名前のメソッド実際にが使用される場所は、しばしば Abstract Factory パターン。 「内部」でnewまたはClass#newInstance()を使用して、対象のインスタンスを作成して返します。知る必要がないかもしれない具体的な実装に関するすべての詳細を隠すだけです。

さらに、このメソッド名は、 Singleton パターンの一部の(ほとんどが自家製の)実装でもよく見られます。

参照:

24
BalusC

絶対に(通常)そうではありません。

getInstanceは、Javaの シングルトンパターン でよく使用される静的メソッドです。 newkeywordは、実際に新しいオブジェクトを作成します。 newが返すオブジェクトを実際に作成するには、ある時点でgetInstanceが必要です(ただし、新しいオブジェクトをインスタンス化する方法は他にもいくつかあります)。

5
user166390

抽象クラスのコンテキストでは、getInstance()メソッドは ファクトリメソッドパターン を表す場合があります。例は抽象 Calendar クラスで、静的ファクトリメソッドと具象サブクラスが含まれています。

5
trashgod

Newキーワードを使用して抽象クラスをインスタンス化できないため、一部の抽象クラスにはgetInstance()メソッドがあります。

2
sodist

はい、これはシングルトンパターンでよく使用されます。クラスのインスタンスが1つだけ必要な場合に使用されます。このメソッドの実装では、クラスのアクティブなインスタンスが存在するかどうかを確認し、新しいインスタンスを作成する代わりにそれを返す可能性があるため、getInstance()を使用することをお勧めします。メモリを節約できる場合があります。この例のように:

    public static DaoMappingManager getInstance() {
    DaoProperties daoProperties = null;
    try {
        daoProperties = (DaoProperties) DaoProperties.getInstance();
    } catch (PropertyException e) {
        e.printStackTrace();
    }
    return getInstance(daoProperties);
}

public static DaoMappingManager getInstance(DaoProperties daoProperties) {
    if (instance == null) {
        instance = new DaoMappingManager(daoProperties);
    }

    return instance;
}
1
whoismaikl

開始の場合:newInstance()は_static method_です。これは、新しいクラスを直接作成せずにアクセスできることを意味します。そして、そのクラス自体を「必要な初期化を使用して」(内部のnew myClass()を介して)作成します。これは、静的メソッドごとに異なる初期化でクラスを作成するさまざまなニーズに合わせて、いくつかのnewInstanceメソッド(newInstance4usage1、newInstance4usage2、...)を追加できることを意味します。これは、クラスのユーザー(最終プログラマー)が心配することなく非常に快適にクラスを作成するのに役立つ場合があります。

これは、initプロセスが複雑であるか、重要なレベルまたは通常のレベルがある場合に非常に役立ちます。このメソッドは、newキーワードによるクラスの作成を妨げません。

私はそれが好きです!


応答が遅いので失礼します。携帯電話で入力しています。

0
Hassan Sadeghi