使用Java实现Vector类的构造函数签名的问题

时间:2015-10-10 18:39:35

标签: java game-engine vector-graphics

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

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

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

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

4 个答案:

答案 0 :(得分:2)

改为使用静态工厂。

使您的构造函数成为私有,并使用适当的名称创建公共静态方法:

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这本书非常好。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

  

Builder Pattern link

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