Java - 实现Cloneable还是添加构造函数?

Ber*_*oël 3 java constructor cloneable

嘿我实际上是在Java上使用自定义Vector类,

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

}
Run Code Online (Sandbox Code Playgroud)

我想添加multiply()方法,该方法将按照指定的因子返回此向量*,

public void multiply(double factor) {
    this.X *= factor;
    this.Y *= factor;
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我使用需要矢量的函数时,我想像它一样使用它

doSomething(ancientVector.multiply(-1D));
Run Code Online (Sandbox Code Playgroud)

但是jvm不满意,因为我发送给函数的arg是void...

我怎么能做到干净,我应该实现Cloneable或创建另一个构造函数的方式multiply吗?

doSomething(ancientVector.multiply(-1D));
Run Code Online (Sandbox Code Playgroud)

或者添加

public Vector(Vector previous, double mFactor) {
    this.X *= previous.getX() * mFactor;
    this.Y *= previous.getY() * mFactor;
}
Run Code Online (Sandbox Code Playgroud)

shm*_*sel 8

我会保持类不可变并返回一个新的Vector:

public Vector multiply(double factor) {
    return new Vector(X * factor, Y * factor);
}
Run Code Online (Sandbox Code Playgroud)

  • @BernieNoël不,不可变意味着对象不变.任何修改都会产生新副本.这使您的代码更安全,更容易推理,尤其是在多线程环境中. (4认同)
  • 并将方法名称更改为"scale". (2认同)