1

今日、BigDecimalクラスに関するいくつかのドキュメントを読んでいるときに、基本的なプロパティに出くわしました。BigDecimalクラスは不変です。

祖母に不変性の概念をどのように説明できますか?

クラスの不変性の長所と短所は何ですか?

拡張クラスは変更可能になりますか?

クラスでBigDecimalを拡張したいことを考えると:

`MyBigDecimal extends BigDecimal` 

拡張は、基本的なオブジェクト指向の設計原則に違反していますか?

4

4 に答える 4

9

祖母に不変性の概念をどのように説明できますか?

この質問を確認してください:不変とはどういう意味ですか

または効果的なJavaから:

不変クラスは、インスタンスを変更できないクラスです。各インスタンスに含まれるすべての情報は、インスタンスが作成されたときに提供され、オブジェクトの存続期間中固定されます。


クラスの不変性の長所と短所は何ですか?

長所:

  • 初期化時に構築された状態は1つしかないため、オブジェクトの状態について推論する方が簡単です。
  • 当然の結果:不変オブジェクトは、状態がすべてである並行プログラミングで使用する方が簡単です。

短所:

  • オブジェクトのプロパティを変更する場合は、新しいプロパティを作成する必要があります=高価です
  • 構築はより複雑になる可能性があります(ビルダーパターンを参照)

拡張クラスは変更可能になりますか?

はい-これが、不変クラスをfinalにする必要がある理由です(または、すべてのコンストラクターをプライベートにし、新しいオブジェクトを作成するためのファクトリを提供します)。

BigDecimalは、不変クラスを作成するときに実行してはならないことの良い例です(拡張することができ、質問で述べたように問題を引き起こす可能性があります)。

于 2012-07-17T10:30:17.220 に答える
3

インスタンスが変更されない不変クラス。オブジェクトの状態は構築時に定義され、その後変更されることはありません。

適切に不変であるために、クラスはその状態を変更する方法(リフレクション以外)を提供しません。セッターメソッド、内部状態を変更するメソッド、保持している可変フィールドへのアクセスを許可するメソッドはありません。また、他のクラスがそれを拡張して、可変フィールドを追加することによって可変にするのを防ぐために、(BigDecimalがそうであるように)finalである必要があります。

利点はたくさんあります:

  • クラスはわかりやすいです
  • インスタンスは本質的にスレッドセーフです
  • インスタンスは、キャッシュからコピーを返す必要なしにキャッシュできます
  • インスタンスは、後で変更されることを恐れずにマップのキーとして使用できます

オブジェクト指向の原則に違反していません。逆に、状態はオブジェクトに完全にカプセル化されています。

注:一部の不変オブジェクトは、オブジェクトの外部から見える状態に影響を与えることなく、内部で状態を変更します(たとえば、一部のフィールドの遅延初期化)。適切に実行された場合、不変オブジェクトのスレッドセーフは変更されません。正しく行わないと、スレッドセーフではなくなる可能性があります。

于 2012-07-17T10:32:02.500 に答える
3

BigDecimalは値クラスです。それは「現実世界」からの価値を表しています。整数を例にとってみましょう。42の値は常に42です。状態は変更できません。43が必要な場合は、変更された42の値ではなく、43の値です。この抽象的な値の概念は、不変のクラスを使用してオブジェクト指向の世界に転送されます。既存の番号に番号を追加する場合、番号は変更されませんが、結果を含む新しい不変オブジェクトが作成されます。

于 2012-07-17T10:32:52.413 に答える
1

クラスの不変性は、オブジェクトが作成された場合、その内容を変更できないことを意味します。

たとえば考えてみてください

String str = "Hello"; // you can not change content Hello to any other string

長所と短所 immutability of a class-長所。/短所 不変性と可変性の比較

拡張クラスは変更可能になりますか?

はい、できます。

MyBigDecimal extends BigDecimal

あなたはそれBigDecimalが最終的ではないことを行うことができます。

于 2012-07-17T10:29:21.860 に答える