考虑一个类实现相同的基本行为,方法等的情况,但是该类可能存在多种不同版本以用于不同用途。在我的特定情况下,我有一个向量(一个几何向量,而不是一个列表),并且该向量可以应用于任何N维欧几里德空间(1维,2维等)。如何定义此类/类型?
在C ++中,这很容易,因为C ++中的类模板可以将实际值作为参数,但是在Java中我们没有那么奢侈。
我可以想到的解决该问题的两种方法是:
在编译时实现每种可能的情况。
public interface Vector { public double magnitude(); } public class Vector1 implements Vector { public final double x; public Vector1(double x) { this.x = x; } @Override public double magnitude() { return x; } public double getX() { return x; } } public class Vector2 implements Vector { public final double x, y; public Vector2(double x, double y) { this.x = x; this.y = y; } @Override public double magnitude() { return Math.sqrt(x * x + y * y); } public double getX() { return x; } public double getY() { return y; } }
该解决方案显然非常耗时并且对代码非常繁琐。在此示例中,它似乎还不错,但是在我的实际代码中,我正在处理具有多个实现的向量,每个实现最多具有四个维度(x,y,z和w)。我目前有超过2,000行代码,尽管每个向量实际上只需要500行。
在运行时指定参数。
public class Vector { private final double[] components; public Vector(double[] components) { this.components = components; } public int dimensions() { return components.length; } public double magnitude() { double sum = 0; for (double component : components) { sum += component * component; } return Math.sqrt(sum); } public double getComponent(int index) { return components[index]; } }
不幸的是,这种解决方案会损害代码性能,导致代码比以前的解决方案更为混乱,并且在编译时也不那么安全(在编译时无法保证您要处理的向量实际上是二维的,例如)。
我目前实际上在Xtend中进行开发,因此,如果有任何Xtend解决方案可用,它们也是可以接受的。