私は単位ベクトルを計算し、それ自身の単位ベクトルを自身に設定する第2のコンストラクタを個人的に作成します。 Ernestが提案するように、理想的にはプライベートな値とgetメソッドを使用する必要があります。その理由は、そうでなければ、他のクラスがオブジェクトの1つにアクセスできる場合にx、y、zなどの値を単純に上書きすることができるからです。 Javaには、純粋なデータストレージに最終クラスを使用する伝統があります。たとえば、String
クラスを参照してください。既存のString
を変更することはできません。新しいString
のみを作成してください。作成後、String
は同じままです。あなたの目的のためにはそれほど重要ではないかもしれませんが、異なるコンテキストでは、あなたのクラスがヒントを持っていない人によって使用されている場合は、アプリケーションが誤動作する可能性があります。場合によってはセキュリティ上のリスクでもあります。
これを無視して直接変数にアクセスして、あまり乱雑なコードや小さなパフォーマンスを楽しむことができます。しかし、私はまだ問題が将来のために何であるかを知ることを提案するでしょう。
とにかく、以下は、単位ベクトルの問題を解決するためのマイナスのゲッターメソッドです。
import java.lang.Math;
class Vector{
public double x,y,z,length;
public Vector unit;
public static void main(String[]s){
new Vector(5,5,5);
}
public Vector(double x, double y, double z){
this.length = Math.sqrt(x*x + y*y + z*z);
this.x=x;
this.y=y;
this.z=z;
this.unit = new Vector(x/length, y/length, z/length, true);
}
private Vector(double x, double y, double z, boolean isUnitVector){
// Temp variable for calculating the length
double length = Math.sqrt(x*x + y*y + z*z);
if (isUnitVector){
this.length = 1;
this.x=x/length;
this.y=y/length;
this.z=z/length;
this.unit = this;
}else{
this.length = Math.sqrt(x*x + y*y + z*z);
this.x=x;
this.y=y;
this.z=z;
this.unit = new Vector(x/length, y/length, z/length, true);
}
}
}
boolean引数の後に続くコンストラクタ間のコードの重複は完全に満足していません。実際には、ファクトリクラスVectorFactory
を1つの静的メソッドで作成します。その唯一の仕事はVectorオブジェクトを作成することです。あるいは、Javaの独自のjavax.vecmath.Vector3d
とそれに関連するクラスを使用することもできます。
説明をお寄せいただきありがとうございます。 – SDuke