4

私はEffectiveJavaを読み、そこに

クラスを不変にすることができない場合は、その可変性を可能な限り制限してください...

...非ファイナルにするやむを得ない理由がない限り、すべてのフィールドをファイナルにします。

したがって、すべてのPOJO(たとえば、、およびフィールドを含む単純なクラス)クラスを常に不変にする必要がありますかBook?また、オブジェクトの状態を変更したい場合(たとえば、ユーザーが多くの本を表すテーブルでオブジェクトを変更した場合)、セッターの代わりに次のようなメソッドを使用します。IDTitleAuthor

public Book changeAuthor(String author) {
   return new Book(this.id, this.title, author);  //Book constructor is private
}

しかし、私は本当に良い考えではありません。

クラスを不変にするタイミングを教えてください。

4

3 に答える 3

6

いいえ、POJOを常に不変にする必要はありません。あなたが言ったように、時々それは悪い考えかもしれません。オブジェクトに時間の経過とともに変化する属性がある場合は、セッターが最も快適な方法です。

ただし、オブジェクトを不変にすることを検討する必要があります。エラーを見つけ、より明確にプログラムし、並行性に対処するのに役立ちます。

しかし、私はあなたが引用することはすべてを言うと思います:

クラスを不変にすることができない場合は、その可変性を可能な限り制限してください...

...非ファイナルにするやむを得ない理由がない限り、すべてのフィールドをファイナルにします。

それがあなたがすべきことです。あなたがセッターを持っているので、それが不可能でない限り。ただし、並行性に注意してください。

于 2012-07-29T10:45:54.267 に答える
1

1. APOJOprivate Instance Variables、withメソッドGetterSetter メソッドを持つものです。

2.そして、常に定数String class必要とするのようなクラスは、時間とともに変化する必要があるクラスではなく、最終的なものである必要があります。 behavior/implementation

3.クラスを不変にするために、finalは解決策private Instance variablesだけではありませんGetter methods。そして、それらの状態はに設定されてい Constructorます。

4.コーディングの決定に応じて、プログラム全体で一定である必要があるフィールドを修正してみてください。特定のフィールドが一定であると思われる場合はimmutable、それらを最終的にしてください。

5. JVMは、定数値を事前計算するために定数畳み込みと呼ばれるメカニズムを使用します。

于 2012-07-29T10:50:57.887 に答える
1

OOPの世界には状態があります。オブジェクトのすべてのプロパティであることを述べます。オブジェクトの状態を変更すると、新しいオブジェクトが返されます。これにより、アプリケーションが特定の機能(同期、ロック、アトミックなど)なしで並行環境で正しく機能することが保証されます。ただし、常に新しいオブジェクトを作成します。

オブジェクトに100個のプロパティが含まれていると想像してください。実際には、100個の要素を持つコレクションがあります。不変性の概念に従うには、このコレクションもコピーする必要があります。これはメモリのオーバーヘッドが大きく、おそらくGCによって処理されます。ほとんどの場合、オブジェクトを不変にするよりも、オブジェクトの状態を手動で処理する方が適切です。いくつかの難しいケースでは、同時発生の問題が非常に難しい場合は、コピーを返す方がよい場合があります。タスクによって異なります。特効薬はありません。

于 2012-07-29T10:55:07.800 に答える