0

クライアントが使用する配列を返すクラスの API 関数を設計しています。しかし、それを戻り値にするか、関数の引数として作成するかはよくわかりません。以下を参照してください。

方法 I:

MyObject[] getMyObject() {... return someObject;}

方法 II:

void getMyObject(MyObject[] someObject) {...//assign value to someObject[index]};

List<MyObject>Android API では、またはを返すのが非常に一般的であることがわかりましたSet<MyObject>。方法 I の方が優れていることを示していますか? では、Java におけるこれら 2 つの方法の長所と短所は何でしょうか?

更新: メソッド II では、someObject ではなく、someObject[index] に値を割り当てることを意味します。私の質問は、「Java は参照または値を渡しますか」に関するものではありません。実行可能な2つの方法を単純に比較しているだけです。

4

4 に答える 4

2

配列はサイズ変更できません。したがって、方法 1 を使用すると、適切なサイズの新しい配列を作成して返すことができます。方法 2 では、受信配列のサイズが間違っていると失敗します。

Java には参照渡しがありません。したがって、メソッド 2 で何かを割り当ててsomeObjectも、呼び出し元には何もしません。の要素のみを変更できますsomeObject

于 2013-08-28T00:55:39.410 に答える
1

Java には 1 つのパラメータ受け渡しメカニズムがあります。すべてが参照渡しではなく、値渡しです。

微妙ですが、本当です。その影響は重要です。

List配列、 、またはであっても、そのメソッドからいつでも戻ることができますSetListまたはの内容を変更できる場合と変更できない場合がありますSet。これは、メソッドを作成した開発者が下の実装を変更できないようにしている可能性があるためです。

個人的には、配列よりもコレクションを好む傾向があります。それらは生の配列よりも表現力があります。返信があればSet、すべてのエントリが何らかの形で一意であることがわかります。

于 2013-08-28T01:03:17.377 に答える
1

どちらの方法にも長所と短所があります。


バージョン #1

MyObject[] getMyObject() {... return someObject;}

長所:

  • これにより、任意の数の結果を返すことができます。
  • 発信者にとっては間違いなく簡単です。

短所:

  • 呼び出されたメソッドは、配列を割り当てる必要があります。(または、配列を管理/リサイクルする必要がありますが、これは一般的には困難です。静的配列を再利用すると、メソッドが再入不可になる可能性があることに注意してください。)

バージョン #2

void getMyObject(MyObject[] someObject) {...//assign value to someObject[index]};

長所:

  • これは、呼び出し元が配列をリサイクル/再利用するのにより適した立場にあるため、割り当てられたオブジェクトの点で優れている可能性があります。
  • 必要に応じて ... に値を渡すことができます。

短所:

  • 呼び出し元配列を提供する必要があるため、メソッドがより使いやすくなります。
  • 呼び出されたメソッドは、配列のサイズを制御できません。つまり、指定された配列が小さすぎる場合、エラーが発生する可能性があります...

配列が渡されて返される 3 番目の方法もあります。配列のサイズが正しくない場合 (または null が渡された場合)、呼び出されたメソッドは配列を割り当てたり再割り当てしたりします。結果は、元の配列または再割り当てされた配列のいずれかになります。


どちらが良いですか?

IMO、最初のバージョンは、正しく取得するのが最も簡単なため、ほとんどの状況で優れています。IMO、新しいオブジェクトの割り当てを最小限に抑える必要性が明らかな場合にのみ、API 設計の代替案を検討する必要があります。(Hotspot Java 実装または同等のコーディングをしている場合、新しいオブジェクトの割り当ては安価です...)

最後に、上記のすべてよりも単純でクリーンな方法はCollection、ベア配列ではなく a を使用することです。標準Collection型を使用すると、正しいサイズのものを事前に割り当てるという煩雑さを回避できます。

于 2013-08-28T01:34:05.677 に答える
1

return は、読み書きするのがより自然であり、「参照」によって渡すことも、目に見えるよりも複雑です..

someObject[i] = a; //works

someObject = a; // doesnt work
于 2013-08-28T00:56:10.030 に答える