繁体   English   中英

Java静态常量类变量赋值

[英]Java static constant class variable assignment

我正在用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);
  }
}

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

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

然后使用它:

Vector2 myVector = Vector2.Zero();

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

您最初的想法是:“但是,这会产生不良后果:myVector变成了Vector2.ZERO(因此是不可更改的”),除非Vector2是不可变的,否则这是不正确的。 您将无法将其他任何内容重新分配给Vector2.ZERO,但是您当然可以修改对象的内容。

使您的类不可变 ,因此add()将返回一个新实例,而不是修改该实例,然后:

myInstance = myInstance.add(myOtherVector);

请参阅BigInteger以获取JDK中此类工作的类。

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

Vector2 myVector = Vector2.ZERO;

意味着您的myVector变量将引用与静态字段Vector2.ZERO相同的对象(在内存中)。 基本上,它引用了内存中的同一对象。

你写了:

someVector本质上似乎是一个指针

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM