Considere una situación en la que una clase implementa el mismo comportamiento básico, métodos, etc., pero podrían existir múltiples versiones diferentes de esa clase para diferentes usos. En mi caso particular, tengo un vector (un vector geométrico, no una lista) y ese vector podría aplicarse a cualquier espacio euclidiano N-dimensional (1 dimensional, 2 dimensional, ...). ¿Cómo se puede definir esta clase / tipo?
Esto sería fácil en C ++, donde las plantillas de clase pueden tener valores reales como parámetros, pero no tenemos ese lujo en Java.
Los dos enfoques que se me ocurren para resolver este problema son:
Tener una implementación de cada caso posible en tiempo de compilación.
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; } }
Obviamente, esta solución consume mucho tiempo y es extremadamente tediosa para el código. En este ejemplo, no parece tan malo, pero en mi código real estoy tratando con vectores que tienen múltiples implementaciones cada uno, con hasta cuatro dimensiones (x, y, zyw). Actualmente tengo más de 2.000 líneas de código, aunque cada vector realmente solo necesita 500.
Especificar parámetros en tiempo de ejecución.
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]; } }
Desafortunadamente, esta solución perjudica el rendimiento del código, da como resultado un código más desordenado que la solución anterior y no es tan seguro en el momento de la compilación (no se puede garantizar en el momento de la compilación que el vector con el que está tratando sea realmente bidimensional, por ejemplo).
Actualmente estoy desarrollando en Xtend, por lo que si hay soluciones Xtend disponibles, también serían aceptables.