我正在用Java构建一个基本的物理引擎,只是为了掌握语言,我遇到了一个问题,我认为我知道如何解决,但不是以任何优雅的方式。
我希望我的PVector类有两个可能的构造函数,一个接受x和y坐标,另一个接受角度和半径。
例如,我们将public PVector(double x, double y)
作为第一个签名,public PVector(double arg, double rad)
作为第二个签名。但是,众所周知,在类中不能有两个具有相同签名的方法,因为Java无法知道要调用哪个方法。
我可以融合两个构造函数并采用第三个参数,如布尔值(isPolar)或使用标志,但这两种方法看起来都很笨拙。我想知道在Java中做这样的事情的最惯用,最明智的方法是什么。任何和所有建议将不胜感激。
答案 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)
使用静态工厂方法ofCartesian
和ofPolar
来调用私有构造函数,而不是公共构造函数,但要明确参数的含义。
答案 3 :(得分:0)
根据您的问题,您可能需要一些必填字段和一些可选字段。您可以使用构建器模式来创建实例。