Java静态常量类变量赋值

时间:2013-11-05 12:27:25

标签: java variable-assignment static-members

我正在用Java创建一个Vector2类,但有一个问题:

public class Vector2 {
    public static final Vector2 ZERO = new Vector2(0,0);
    ...
}

在另一堂课中,我想像这样打电话给ZERO:

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

4 个答案:

答案 0 :(得分:3)

如果你想让你的向量是可变的,那么拥有一个保持零向量的静态字段不是一个好的选择(因为它可以在以后变异为其他东西。

您可以采取两种方法:
可变载体

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);
  }
}

答案 1 :(得分:2)

您可能想要创建一个静态工厂方法来返回一个已归零的新Vector。

public class Vector2 {
    public static Vector2 Zero() {
         return new Vector2(0,0);
    }
}

然后使用它:

Vector2 myVector = Vector2.Zero();

当然,如果您的默认构造函数将向量初始化为0,0,那么您可能不需要它,只需执行:Vector2 myVector = new Vector2();

您最初的想法是:“然而,这表现得不合理:myVector只是变成了Vector2.ZERO - 因此不可更改 - ”是不正确的,除非Vector2是不可变的。您将无法将任何其他内容重新分配给Vector2.ZERO,但您当然可以修改该对象的内容。

答案 2 :(得分:1)

制作班级immutable,以便add()返回新实例而不是修改实例,然后:

myInstance = myInstance.add(myOtherVector);

请参阅BigInteger,了解JDK中一个类似于此的类。

答案 3 :(得分:0)

这是OOP和对象引用的重点。

Vector2 myVector = Vector2.ZERO;

表示您的myVector变量将引用与静态字段Vector2.ZERO相同的对象(在内存中)。基本上它是在内存中提供相同的对象。

您写道:

  

someVector基本上似乎是一个指针

好吧,那是好事。引用可以理解为指向对象的指针,就像指向C中定义的内存地址的指针一样。