0

セッターを使用して別のPOJOクラスBのNフィールドにデータを入力し、POJOを呼び出し元に返すメソッドを含むクラスAを含む本番環境で使用されている既存のコードベースがあり、クラスBのすべてのインスタンスが2つのフィールド、つまりN-2フィールドは、クラスBのすべてのインスタンスで同じになります。クラスAにクラスBへの静的参照があり、静的で変更されないクラスBのフィールドを初期化すると、パフォーマンスが向上します。初期化ブロック?このように、各呼び出しでクラスBのN個のフィールドにデータを入力していたクラスAのメソッドは、異なる2つのフィールドのみにデータを入力する必要があります。これにより、クラスAのメソッドを呼び出すたびにタイプBの新しいオブジェクトを作成する必要もなくなります。マルチスレッドアプリケーションでのこのアプローチの意味は何ですか。

あるいは、静的として変更されないクラスBのすべてのフィールドを宣言して、クラスAのメソッドが呼び出しごとに変更されるフィールドのみを設定するようにすることもできます。いずれにせよ、パフォーマンスの向上はそれだけの価値がありますか、それともこの変更は時期尚早の最適化と見なされますか?

例 :

class A { 
     private static B b = new B(); 

     static {
         b.setSystem("MySystem");
         b.setVersion("1.1");
     }

     public B getB(String name) {
         b.setName(name);
         return B;

     }
}
4

3 に答える 3

2

クラスBのすべてのインスタンスは、2つのフィールドのみに関して異なることになります。

だから私はあなたがBの複数のインスタンスを持っていることを理解しています

これにより、クラスAのメソッドを呼び出すたびにタイプBの新しいオブジェクトを作成する必要もなくなります。

しかし、今ではBのインスタンスは1つだけです。Aがこれらの2つのフィールドを変更すると、Bのそのインスタンスへの参照を持つコード内のすべての場所に変更が表示されます(適切な同期を前提としています)。

=>Bのインスタンスが1つ以上必要かどうかは明確ではありません。

マルチスレッドアプリケーションにおけるこのアプローチの意味は何ですか?

スレッド間でBの同じインスタンスを共有する場合は、Bのプロパティの書き込みと読み取りを行うときに、適切な同期を使用していることを確認する必要があります。

または、静的として変更されないクラスBのすべてのフィールドを宣言することもできます。

ファイナルですか?

いずれにせよ、パフォーマンスの向上はそれだけの価値がありますか、それともこの変更は時期尚早の最適化と見なされますか?

それは確かに適格だと思います。特に、何が必要かについてはまだ100%確信が持てないようです。いつもと同じアドバイスです。簡単でシンプルな方法で行ってください。パフォーマンスが十分でない場合は、コードのどの部分を改善する必要があるかをプロファイリングして決定します。

マルチスレッド環境になることがわかっている場合は、静的で変更可能なものは避けてください。これにより、作業が楽になり、同時実行バグのリスクが制限されます。

理想的には、(1)スレッド間でオブジェクトを共有しないようにします-できない場合は、(2)不変オブジェクトを共有しようとします-できない場合は、(3)適切な同期を使用し、自分が何を知っているかを確認しますやっている。

于 2012-09-05T09:15:30.577 に答える
0

セッターを使用して別のPOJOクラスBのNフィールドにデータを入力するメソッドを含むクラスAがあるとします。

では、AにはBのインスタンスまたはBのインスタンスのリストがありますか?

そして、POJOを呼び出し元に返し、クラスBのすべてのインスタンスが2つのフィールドのみに関して異なる場合、つまり、N-2フィールドはクラスBのすべてのインスタンスで同じになります。

N-2B自体のフィールドを直接初期化しないのはなぜですか。

クラスAにクラスBへの静的参照があり、静的initブロックで変更されないクラスBのフィールドを初期化する場合、パフォーマンスが向上しますか?このように、各呼び出しでクラスBのN個のフィールドにデータを入力していたクラスAのメソッドは、異なる2つのフィールドのみにデータを入力する必要があります。これにより、クラスAのメソッドを呼び出すたびにタイプBの新しいオブジェクトを作成する必要もなくなります。マルチスレッドアプリケーションでのこのアプローチの意味は何ですか。

を使用する場合、BはオブジェクトではなくクラスStaticの一部になるため、Bはすべてのインスタンスに共通になります。本当に必要ですか?AAA

あるいは、静的として変更されないクラスBのすべてのフィールドを宣言して、クラスAのメソッドが呼び出しごとに変更されるフィールドのみを設定するようにすることもできます。いずれにせよ、パフォーマンスの向上はそれだけの価値がありますか、それともこの変更は時期尚早の最適化と見なされますか?

コードを入力してください。私の意見では、静的ブロックは構成オブジェクトの初期化にのみ使用する必要があります。

于 2012-09-05T09:21:41.800 に答える
0

必要に応じて変更してそのメソッドから返すクラスのインスタンスを1つだけ保持する場合はB、問題が発生する可能性があります。呼び出し元は、要求したデータを含む返されたオブジェクトに依存できません。シングルスレッドアプリケーションでは、その値を保存して後でアクセスすると、間にメソッドへの別の呼び出しがあった場合に問題が発生します。マルチスレッドアプリケーションでは、別のスレッドがメソッドを呼び出してオブジェクトを変更する可能性があるため、現在のスレッドからそのような呼び出しがなくてもコンテンツが変更される可能性があります。オブジェクトは、その間に一貫性のない状態にある場合もあります。

これを安全かつ合理的に使用できる場合もあるかもしれませんが、あなたが提供する一般的な説明から、私はそれに反対することをお勧めします。おそらく、より良い解決策は、2つの変化する値と、変更不可能な部分を保持する別のオブジェクトへの参照のみを保持するBような方法で、クラスの変化しない部分を除外することです。Bもちろん、これは、の実装を制御する場合にのみ適用されますB

于 2012-09-05T09:15:21.400 に答える