2017-10-30 7 views
3

ねえ、私は実際には、Java - Cloneableを実装するか、コンストラクタを追加しますか?

public class Vector { 

    private double X; 
    private double Y; 

    public Vector(double x, double y) { 
     this.X = x; 
     this.Y = y; 
    } 

    public void setX(double x) { 
     this.X = x; 
    } 
    public double getX(double x) { 
     return this.X; 
    } 

    public void setY(double y) { 
     this.Y = y; 
    } 
    public double getY(double y) { 
     return this.Y; 
    } 

} 

が、私はそのような指定の要因により、このベクトル*を返す乗算()メソッドを追加したい、ジャワのカスタムVectorクラスで働いている

public void multiply(double factor) { 
    this.X *= factor; 
    this.Y *= factor; 
} 

事は、私はベクトルを必要とする機能を使用する場合、私は

doSomething(ancientVector.multiply(-1D)); 

のようにそれを使用したいのですが、ですが、argは、私はに送信するので、JVMが成立していません機能は、void ...

Cloneableを実装するか、別のコンストラクタを作成すると、それをきれいにするにはどうすればいいですかmultiply

doSomething(ancientVector.multiply(-1D)); 

OR

public Vector(Vector previous, double mFactor) { 
    this.X *= previous.getX() * mFactor; 
    this.Y *= previous.getY() * mFactor; 
} 
+1

なぜ2回の呼び出しでそれをしないのですか? '' 'myVector.multiply(-1D))' ''それから '' 'doSomething(myVector);' ''。 – Freiheit

+0

私の質問はなぜ 'Vector'が全く変更可能なのかということでしょう。なぜ 'setX'と' setY'メソッドがあるのでしょうか?そのようなものが変化しているような場合は、効果的に新しいベクターを作成しているようです。 – StriplingWarrior

答えて

8

私は不変クラスを維持して返します追加Vector新しい:

public Vector multiply(double factor) { 
    return new Vector(X * factor, Y * factor); 
} 
+0

ええ、また自己オブジェクトを変更する別の乗算関数voidを追加しますか? –

+0

私はこのアプローチに同意します。クラスを不変にすることが何を意味するのかを詳しく教えてください。 – JimN

+4

@BernieNoëlNo、immutableは、オブジェクトが変更されていないことを意味します。変更を加えると、新しいコピーが作成されます。これにより、特にマルチスレッド環境で、コードをより安全に扱いやすくすることができます。 – shmosel

1

@Bastiが言ったようにあなたが行うことができたり、また新しいインスタンスを返すことができますあなたのベクトルの:

public Vector multiply(double factor) { 
    return new Vector (this.X * factor, this.Y * factor); 
} 

このように、乗算関数の結果に変更が加えられた場合、初期ベクトルオブジェクトには影響しません。

+1

これはshmoselの答えとどう違うのですか? – StriplingWarrior

+0

それは違いはありませんが、私たちはほぼsimulatenously公開したと思います – alainlompo

1

あなたのVectorにはさまざまな操作があります(これはmultiplyで始まりました)。その使い方はBigDecimalなどのJava APIクラスと似ています。私はそれに従うことを推奨し、クラスを不変にします。それは、そのすべてのフィールドが最終でなければなりません意味:

不変クラスの利点の
public class Vector { 
    private final double x, y;    // Note: final. And use lowercase. 

    public Vector(double x, double y) { 
     this.x = x; 
     this.y = y; 
    } 

    // Note: no setters! 

    public double getX() {     // Note: no argument. 
     return x; 
    } 

    public double getY() { 
     return y; 
    } 

    public Vector multiply(double factor) { 
     return new Vector(x*factor, y*factor); 
    } 

} 

一つは、あなたがコピーconstuctorsまたはクローニングを心配する必要はありませんので、彼らは純粋に値ベースであるということです。 (ところで、現在はほとんど使用されていません。おそらく配列を除いて、コピーコンストラクタが好まれます。)コピーする代わりに、代入:Vector secondVector = firstVector;を使用してください。

+0

はい不変性はそんなに悪いことではありません... –

関連する問題