2016-04-14 12 views
0

クラスにオブジェクトがインスタンス変数として含まれていて、コンストラクタの1つにパラメータと同じ型のオブジェクトが含まれている場合は、引数をインスタンス変数に代入するか、新しいOBJECTをインスタンス変数に割り当てます。私は、オプションA型指定されたが、私はthis.centerが、間接的に変更することができ、既存のオブジェクトを参照する場合、これはバグの振る舞いを作成することができると考え、当初はコンストラクタパラメータのオブジェクト:新しいインスタンスの作成、またはポインタの割り当て?

public class MyCircle { 

    private MyPoint center; //contains variables int x and int y 
    private int radius; 

    //Non-controversial Constructor: 
    public MyCircle(int x, int y, int radius) { 
    //creates new center using a valid MyPoint constructor 
    this.center = new MyPoint(x, y); 
    this.radius = radius; 
    } 

    //OPTION A 
    public MyCircle(MyPoint center, int radius) { 
    this.center = center; 
    this.radius = radius; 
    } 

    //OPTION B 
    public MyCircle(MyPoint center, int radius){ 
    this.center = new MyPoint(center.getX(), center.getY()); 
    this.radius = radius; 
    } 
} 

:ここ

は、私が通じ働いている運動の例です無意識のうちに。別の考え方は、センターを共有する複数のオブジェクトを作成する手段を作り、そのセンターを共有するすべてのサークルを意図的に移動させるということです。 Javaはそのオプションが破棄されます(少なくともない開発者のための)何のポインタを持っていないと、この今進むべき道.. ではありませんので

+0

ここでは、コーリングコードでセンターを変更できるようにするために、実際のベストプラクティスはありません。それともあなたはしません。また、 '' MyPoint''が '' x''と '' y''の値を変更できないように不変であることを確認すると、 '' MyPoint''をコピーする必要がなくなります。コンストラクタ。 – f1sh

答えて

0

public MyCircle(MyPoint center, int radius) { 
    this.center = center; 
    this.radius = radius; } 

がより良い私の意見では、あなただけのことができますセンターを割り当て、クラスMyPointの危険なコピーを作成する必要はありません...そして、もしあなたがそれをしたいのであれば、少なくともそのパラメータの非null条件をチェックする必要があるので、私は危険だと言います....

あなたは確かに考えることができます...オプションAでセンターがヌルである場合、あなたは正しいです、それが起こる可能性があります、そしてあなたは違法なameterexception、またはそのオブジェクトをデフォルト値に割り当てるだけです。 ..

しかし、私は私の意見である前に言ったように...

+0

ありがとうございます。私は "ポインタ"がそのような特定の用語であったことに気付かなかった。質問は本当に "新しいオブジェクトを作成するか、または既存のオブジェクトへの参照を割り当てる"べきであるか?私は、MyPoint、または同様のオブジェクトがnullであるかもしれないという警告に感謝します。 –

0

私はそれはあなたのプログラムに依存だと思います。円にMyPointオブジェクトへの参照が必要な場合は、それを渡す必要があります。それ以外の場合は、実際にはxyの値自体を渡さないでください。例えば

、オプションBは次のように記述することができます。変更したいとき

public MyCircle(int x, int y, int radius) { 
    // rest 
} 
0

両方のオプションが細かいですが、あなたが話したように、オブジェクトが時間に変更される可能性があり、オプションAはokです例えばList of Circlesのように、同時に複数のオブジェクトの中心に置くことができますが、ユニークで独立した中心点を使用する場合は、オプションBが正しいです。だから、あなたは両方のコンストラクタを持っていないし、あなたのアプリで多くの場合に応じて1つまたは別のものを使用して、あなたがより良いと思うものを使用し、両方を保つ、それは私のアドバイスです。

あなたのお役に立てば幸いです。

関連する問題