2

静的参照変数があります

static IMail mailer = null;

クラス SearchManager のコンストラクターで値を割り当てています

public SearchManager(ILog logger, String basePath, String indexPath, String nwId, IMail mailer) {
        this.logger = logger;
        this.basePath = basePath;
        this.indexPath = indexPath;
        this.nwId = nwId;
        this.mailer = mailer;
    } 

コードでメーラーを使用しています。このクラスのコンストラクターは、複数回呼び出される可能性があります。したがって、コンストラクターが呼び出されるたびに、この静的参照変数がどのように動作するかというクエリがあります。コンストラクターを初めて呼び出したときに渡した値のみを取得しますか、それともコンストラクターを呼び出すたびに異なる値を取得しますか?

4

6 に答える 6

5

まず第一に、 static variable で 'this' キーワードを使用しないでください。次のことができます(ただし、推奨されません)

public SearchManager(ILog logger, String basePath, String indexPath, String nwId, IMail mailerarg) {
        this.logger = logger;
        this.basePath = basePath;
        this.indexPath = indexPath;
        this.nwId = nwId;
        mailer = mailerarg;
    } 

はい、静的変数であることは、クラスの新しいオブジェクトを作成するたびに変更されます。静的変数は、個々のインスタンスではなく、クラスに属します。したがって、その値を変更するたびに、対応するすべてのクラス オブジェクトに反映されます (すべてのオブジェクトにはクラス情報があります)。

于 2013-07-24T11:13:43.270 に答える
1

コンストラクターを初めて呼び出したときに渡した値のみを取得しますか、それともコンストラクターを呼び出すたびに異なる値を取得しますか?

インスタンスによって共有されるため、異なる値を取り、各インスタンスはもちろん同じ値を参照します。

JLS 8.3.1.1に従って:

フィールドが静的であると宣言されている場合、クラスのインスタンスが最終的にいくつ (場合によってはゼロ) 作成されるかに関係なく、フィールドの具体化は 1 つだけ存在します。クラス変数と呼ばれることもある静的フィールドは、クラスが初期化されるときに具体化されます。

于 2013-07-24T11:11:25.610 に答える
1

コンストラクターを初めて呼び出したときに渡した値のみを取得しますか、それともコンストラクターを呼び出すたびに異なる値を取得しますか?

コンストラクターを呼び出すたびに、異なる値が取られます。

静的変数は特に特別なものではありません。変数に値を代入すると、変数はその値を取ります。これは静的変数にも同様に当てはまるため、静的変数を複数回割り当てると、その値は毎回更新されます。


この場合、コンストラクターを (潜在的に) 異なる引数で複数回呼び出している場合、これは単一の静的変数ではなく、インスタンス固有のフィールドであるように聞こえます。そうすれば、それぞれが、たまたま最後に構築されたマネージャのメーラーではなく、それが構築されたSearchManagerの参照を持ちます。mailer

これに同意せず、mailerアプリケーション全体に単一のものを用意する必要があると思われる場合でも、現在の管理方法を変更することをお勧めします。コンストラクターに渡される値は、そのインスタンスに使用される傾向があります。MailerSupport.setGlobalMailer(mailer)したがって、コンストラクターで静的変数を設定することは非常に混乱を招く可能性があり、値を変更したいときはいつでも、代わりに何かを明示的に呼び出す方がよいでしょう。

于 2013-07-24T11:12:14.460 に答える
1

オブジェクトのすべてのインスタンスは静的データを共有します。したがって、すべてのインスタンス (SearchManager コンストラクターへの呼び出し) はメーラーを共有します。

つまり、SearchManager への最初の呼び出しがメーラーの値 "X" を持ち、SearchManager への別の呼び出しがメーラーの値 "Y" を設定すると、すべてのインスタンスがメーラーの値 Y を持つようになります。

于 2013-07-24T11:12:27.673 に答える
0

値はいつでも変更できますが、すべてのインスタンスには同じ最新の値があります。つまり、最後に呼び出された時間です。

于 2013-07-24T11:14:43.887 に答える
0

その値は何度でも変更できますが、すべてのインスタンスに同じ値が表示されます。

于 2013-07-24T11:11:53.067 に答える