Java 中实现 Vector class 的构造函数签名问题

Issue with constructor signatures implementing Vector class in Java

我正在 Java 构建一个基本的物理引擎只是为了掌握语言的窍门,我 运行 遇到了一个我认为我知道如何解决但不知道如何解决的问题以任何优雅的方式。

我希望我的 PVector class 有两种可能的构造函数,一种接受 x 和 y 坐标,另一种接受角度和半径。

例如,我们将 public PVector(double x, double y) 作为第一个签名,public PVector(double arg, double rad) 作为第二个签名。但是,众所周知,class 中不能有两个具有相同签名的方法,因为 Java 无法知道调用哪个方法。

我可以融合这两个构造函数并采用第三个参数,例如布尔值 (isPolar) 或使用标志,但这两种方法看起来都很笨拙。我只想知道在 Java 中做这样的事情最惯用、最明智的方法是什么。任何和所有建议将不胜感激。

改用静态工厂。

将您的构造函数设为私有,并使用适当的名称制作 public 静态方法:

public static PVector makeFromXAndY(double x, double y) {
    return new PVector(...);
}

public static PVector makeFromArgAndRadius(double arg, double radius) {
    return new PVector(...);
}

private PVector(double x, double y) {
    ....
}

Joshua Bloch 的 Effective Java 一书在这方面做得很好。

您可以使用构造向量的静态方法,类似于工厂,调用私有构造函数:

public static PVector fromAngle(double r, double theta){
    return new PVector(/*trig here*/);
}

您可以将其称为 PVector v = PVector.fromAngle(3, Math.PI)

不使用public构造函数,而是使用调用私有构造函数的静态工厂方法ofCartesianofPolar,但要明确参数的含义。

根据您的问题,您可能需要一些必填字段和一些可选字段。您可以使用 Builder 模式 来创建实例 .

Builder Pattern link

  1. 即使创建静态方法,您也需要一个全参数构造函数并通过在静态方法中放置一些逻辑来相应地传递参数。