3

多分私はまだ重要な概念を見逃しています。

非プリミティブ メンバーの読み取りを許可し、書き込みを防止するために、対応する getter は常にメンバー オブジェクトの新しいコピーを作成します。パフォーマンス上の理由から、これを防止したいと考えています。四分木に基づく衝突検出を備えた単純な 2D シミュレーターを作成しようとしていますが、これはパンとバターになります。

C++では、constを返すことでできると思います。(これをキャストで上書きできることはわかっています)しかし、これがJAVAでどのように行われるかはわかりません。

何か案は?

4

3 に答える 3

3

やりたいことをアーカイブするには、いくつかの方法があります。

まずconst、C++ で行うことに対する言語サポートはありません。

いずれにせよ、Getter と Setter を使用することをお勧めします。これらによってオーバーヘッドがまったく発生しないためです。Java のジャストインタイム最適化がこれを処理します。

非プリミティブ型の場合、返されたオブジェクト自体が変更される可能性があるという問題がまだあります。これを防ぐには3つの方法があります。

  1. オブジェクトをまったく返しません。親オブジェクトの複数のゲッターによって、オブジェクト内に格納されたデータを提供します。
  2. 不変オブジェクトまたは不変ビューを使用します。したがって、一般に変更できないオブジェクト、またはオブジェクトのビューのみを提供するがセッター オブジェクトをブロックするオブジェクトです。
  3. clone または copy-constructor を使用して、元のオブジェクトのコピーを返します。
于 2012-09-17T12:03:03.723 に答える
2

カスタム参照型は自由に不変にすることができます。

すべてのオブジェクトのクローンを作成すると言っていますか?ヒープの問題がある可能性があります。私は不変の解決策を好みます。スレッドセーフで、メモリ消費量が少なくなります。

Javaでは、C ++returnconstの言語サポートはありません。変更不可能なコレクションを返すことはできますが、希望する動作を実現するには、クラスを適切にコーディングする必要があります。

于 2012-09-17T11:55:49.893 に答える
1

対応するゲッターは常にメンバーオブジェクトの新しいコピーを作成します

理論的にはそうですが、実際にはこれは保証されておらず、通常は最適化されます。

パフォーマンス上の理由からこれを防ぎたい。

C ++を使用している場合、C ++で心配していた問題の多くはJavaでは問題ではないことに気付くかもしれません(逆もまた同様です;)


JITがすべての単純なゲッターを最適化してパフォーマンスのオーバーヘッドがないことを考慮すると、次の単純な形式で十分であることがわかる場合があります。

private int x; // non-final so it can be changed
// or better
private final int x; // makes it clear the field will not be changed.

public int getX() { return x; }

使用するかどうかの違いfinalは、パフォーマンスではなく明確さです。

于 2012-09-17T11:56:33.483 に答える