0

たとえば、次を使用する必要があります。

public Line(Vector dorigin, Vector ddir) 
{
    origin = dorigin.clone(); 
    dir = ddir.clone();
} 

それ以外の:

public Line(Vector dorigin, Vector ddir) 
{
     origin = dorigin; 
     dir = ddir;
}

???

では、次のようなプログラムがあるとします。 Line[] line = new Line[10];

for (i = 0; i < n; i++)
{
    Vector temp = new Vector(i, 0);
    line[i] = new Line(temp, temp);
}
//and then operate on the array line

次に、最初のコンストラクターを使用する必要がありますか?

4

6 に答える 6

2

clone()壊れていると見なされることが多くfinal、コンストラクターを明示的にコーディングします (または構築メソッドに委譲しますが、を使用して不変性を簡単に強制することはできません)。

編集した質問に対処するには、元のパラメーターへの単なる参照ではなく、渡されたエンティティのコピーがコンストラクターに必要ですか? コレクションを渡す場合は、コレクションと、場合によってはそのコレクションに含まれるエンティティのコピーを取得する必要がある場合があります (エンティティの実装によっては、可能な場合と不可能な場合があります)。もちろん、元のエンティティが不変である場合は問題ではなく、問題なく参照を渡すことができます。ただし、外部の関係者がそのコレクションを変更 (再注文、追加、削除など) しないように、コレクションのコピーについて心配することはできます。

誰が実際にそのデータを所有していますか? ここで重要な質問です。

于 2013-10-07T10:27:45.920 に答える
0

原点が Line クラスのインスタンスである場合は、使用する必要があります

public Line(Vector dorigin, Vector ddir) {origin = dorigin; dir = ddir;}
于 2013-10-07T10:29:49.807 に答える
0

必要なクローンは呼び出されません.SOはここでは必要ありません。これをチェックしてください http://www.tutorialspoint.com/java/lang/object_clone.htm

于 2013-10-07T10:30:50.217 に答える
0

IMOはclone()、この方法で、コンストラクター内ではなく、ライン構築を呼び出すことをお勧めします

Line l = new Line(dorigin.clone(), ddir.clone());

より明確であり、コンストラクターで「値による」または「参照による」を隠しませんが、呼び出し元に決定させます。
クローンの使用(または使用しない)に関するすべての考慮事項に加えて、この考慮事項(@Brianの回答を参照)

于 2013-10-07T10:37:30.800 に答える
0

それはあなたが達成しようとしているものに依存します。ライン内のベクトルのコピー、またはそれらへの参照だけが必要な場合。

おそらく Vector は不変であるため、それらへの参照だけを簡単に取得できます。その方が簡単で速いでしょう。

clone() メソッドに関するブライアンの回答にも注意してください。

于 2013-10-07T10:34:33.220 に答える
0

あなたが探しているものがわからない(標準的な慣行、効率など)効率に関する限り、既存のオブジェクトの追加のコピーを作成することを避けるため、クローンを作成しないという後者のアプローチの方が優れています。ただし、それはすべて、コードに何を求めるかによって異なります。

これらのオブジェクトがクラスで変更された場合に影響を受けないようにdoriginする必要がある場合は、クローン作成がオプションであり、さらに調査する必要があります。ddirLine

そうでなければ、そのような要件がない場合は、クローニングを使用することをお勧めします。

于 2013-10-07T10:47:21.780 に答える