Stellen Sie sich eine Situation vor, in der eine Klasse dasselbe grundlegende Verhalten, dieselben Methoden usw. implementiert, jedoch mehrere unterschiedliche Versionen dieser Klasse für unterschiedliche Verwendungszwecke vorhanden sein können. In meinem speziellen Fall habe ich einen Vektor (einen geometrischen Vektor, keine Liste) und dieser Vektor könnte auf jeden N-dimensionalen euklidischen Raum (1-dimensional, 2-dimensional, ...) angewendet werden. Wie kann diese Klasse / dieser Typ definiert werden?
Dies wäre in C ++ einfach, wo Klassenvorlagen tatsächliche Werte als Parameter haben können, aber wir haben diesen Luxus in Java nicht.
Die zwei Ansätze, die ich mir vorstellen kann, um dieses Problem zu lösen, sind:
Implementierung jedes möglichen Falls zur Kompilierungszeit.
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; } }
Diese Lösung ist offensichtlich sehr zeitaufwändig und äußerst mühsam für den Code. In diesem Beispiel scheint es nicht schlecht zu sein, aber in meinem eigentlichen Code habe ich es mit Vektoren zu tun, die jeweils mehrere Implementierungen mit bis zu vier Dimensionen (x, y, z und w) haben. Ich habe derzeit über 2.000 Codezeilen, obwohl jeder Vektor wirklich nur 500 benötigt.
Parameter zur Laufzeit angeben.
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]; } }
Leider beeinträchtigt diese Lösung die Codeleistung, führt zu unübersichtlichem Code als die vorherige Lösung und ist zur Kompilierungszeit nicht so sicher (es kann zur Kompilierungszeit nicht garantiert werden, dass der Vektor, mit dem Sie sich befassen, tatsächlich zweidimensional ist. zum Beispiel).
Ich entwickle derzeit in Xtend. Wenn also Xtend-Lösungen verfügbar sind, sind diese ebenfalls akzeptabel.