我正在用Java创建一个Vector2类,并且有一个问题:
public class Vector2 {
public static final Vector2 ZERO = new Vector2(0,0);
...
}
在另一堂课中,我想这样称呼零:
Vector2 myVector = Vector2.ZERO; //initialize to zero
myVector.add(myOtherVector); //myVector is now the sum of Vector2.ZERO and myOtherVector
但是,这表现不理想:myVector只是变为Vector2.ZERO(因此是不可更改),而不是被初始化为零值,然后可以随意使用。要获得我想要的行为,我需要:
Vector2 myVector = new Vector2(Vector2.Zero); //initialize to zero with copy constructor
我在这里对Java的语义有些困惑(即someVector本质上似乎是一个指针而不是一个实际的对象,因此我必须创建一个新对象并显式复制值。)在阅读完之后,我知道有一个在那个话题上很多困惑。是否有一种简单的方法来实现我正在寻找的语法,还是应该坚持使用选项2?如果没有,是否有办法防止选项1中的分配?如果我不在编译时停止它,它将使我以后难以捕捉到一些错误。
编辑:Vector2不是一成不变的。我想要的是让Vector2.ZERO是一个常数值,我可以将其用于赋值,但随后可以正常操作这些新变量。现在,如果我在多个位置进行该分配,那么所有这些都只是指向同一对象的指针(因为它是静态的,所以只会累积更改)。
例如,在Unity中使用向量时,我会说:
Vector2 myFirstVector = Vector2.ZERO; //first vector, initialized to zero
...//do some stuff to change the value of myFirstVector, Vector2.ZERO unchanged
Vector2 mySecondVector = Vector2.ZERO; //second vector, also initialized to zero
...//do some stuff to mySecondVector
如果您希望向量可变,那么拥有一个包含零向量的静态字段不是一个好选择(因为它以后可能会变异为其他东西)。
您可以采用两种方法:
可变向量
public class Vector2 {
public static Vector2 Zero() {
return new Vector2(0,0);
}
}
不可变的向量
public class Vector2 {
public static final Vector2 ZERO = new Vector2(0, 0);
private final int x;
private final int y;
public Vector2(int x, int y) {
this.x = x;
this.y = y;
}
public Vector2 add(Vector2 v) {
return new Vector2(this.x + v.x, this.y +v.y);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句