6

初心者の質問でごめんなさい。参照対値を渡すのは難しいです!

だから私はかなり大きなデータ構造を持つクラスを持っています-多次元配列。別のクラスからこれらの配列にアクセスする必要があります。配列を公開して、従来のobjectWithStructures.structureOneを実行するだけで済みます。または、getterを実行することもできます。publicint[] [] [] getStructureOne()のようなメソッドを追加します。

ゲッターを持っていると、多次元配列のコピーが作成されますか?それとも、参照によってそれを渡し、参照されているオブジェクトを変更することはできませんか?

メモリとパフォーマンスが心配です。しかし、データ構造を公開することは、コピーが作成されない場合は高速になりますが、コーディング方法が不十分なように思われます。

補遺:では、getterメソッドを使用してオブジェクト(配列など)への参照を返す場合、getterメソッドを使用する人は誰でもそのオブジェクトを編集できますか?それとも、それが含まれているクラスだけがそのオブジェクトを変更できるように、編集のために何らかの形で「ロック」されていますか?

4

4 に答える 4

4

実際にはJavaでは、参照はメモリアドレスのであるため、技術的にはすべて値渡しですが、参照渡しと考えることができます。

パフォーマンスに関しては、JVM JIT コンパイラーがおそらくアクセサー メソッド (「ゲッター」) をインライン化するため、測定可能な違いがあるとは思えません。スタイルの問題として、フィールドを公開するよりもゲッターを使用する方が良いと考えられています。

安全な公開 (個人データへの安全なアクセスを許可する) については、いいえ、オブジェクトは「読み取り専用モードでロック」されていません。配列は可変であるため、完全に編集可能です。

データ配列へのアクセスを安全に許可するには、基本的に次の 2 つの選択肢があります。

  1. ゲッターから配列のコピーを返します-高価です
  2. 特定の位置にある要素を返す API を提供します。コーディングは簡単ですが、API がクラス用に定義されているため、後で配列の次元を変更するのが難しい場合があります。

API を提供する例は次のとおりです。

public int getStructureOne(int x, int y, int z) {
    return structureOne[x][y][z];
}

プリミティブ ( などint) は値渡しされるため、このメソッドは完全に安全です。呼び出し元がこのメソッドの結果が代入される変数の値を変更しても、配列には何も起こりません。

于 2012-09-18T00:51:34.217 に答える
4

参照渡しと値渡しは難しい

Java では、すべてが値渡しされます。プリミティブ型は値によって渡され、複合型は参照の値によって渡されます。配列はプリミティブではないため、参照は渡されます。

配列を公開することもできます...または、ゲッターを実行することもできます

それらがそうである場合public、他のクラスは、オブジェクト自体に含まれる配列参照を変更できます。配列への参照を返すゲッターがある場合、呼び出し元は配列の内容を変更できます。どちらもかなり悪いです。これは、追加の質問にも答えます。

オプションは次のとおりだと思います。

  • @Bohemian が示唆するように、個々のセルにゲッターを使用します。配列オブジェクトのロックが必要な場合は、ここで追加のペナルティが発生する可能性があります

  • 配列への参照を返し、呼び出し元が混乱しないことを信頼します。コンパイル時にアクセスをチェックすることで、追加のチェックを実装できます。

  • オブジェクト内に配列の2 つのコピーを保持します。1 つは getter で返され、もう 1 つは実際の作業に使用されます。配列を変更しても効果がないことを文書化し、ゲッターから戻るときにそれらの内容が同じであると主張できます。

于 2012-09-18T01:11:32.307 に答える
1

Everything is pass by value, but the getter would be returning a reference to the array, no copies involved.

anyone who modifies would be seen by everyone with a reference to that array.

as for 1) performance, the only way to know is to benchmark. a get method is going to add overhead, but if your structures are huge, any accesses to elements in the structure is going to dwarf any overhead of an added method call.

as for 2) poor coding practice, it really depends on what you are doing. does your code need to ensure it can't be modified by anyone else? then return a copy. or better yet, force the caller to ask for a range of the data, and only return them a copy of the range they need.

于 2012-09-18T00:26:51.440 に答える
0

Javaはすべてを値で渡します。Java参照は、値によって渡されるポインターです。

于 2012-09-18T03:54:02.883 に答える