Considere uma situação em que uma classe implemente o mesmo comportamento básico, métodos etc., mas várias versões diferentes dessa classe podem existir para diferentes usos. No meu caso particular, eu tenho um vetor (um vetor geométrico, não uma lista) e esse vetor pode ser aplicado a qualquer espaço euclidiano N-dimensional (1 dimensional, 2 dimensional, ...). Como essa classe / tipo pode ser definida?
Isso seria fácil em C ++, onde os modelos de classe podem ter valores reais como parâmetros, mas não temos esse luxo em Java.
As duas abordagens que posso pensar para resolver esse problema são:
Ter uma implementação de cada caso possível em tempo de compilação.
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; } }
Esta solução é obviamente muito demorada e extremamente tediosa para codificar. Neste exemplo, não parece tão ruim, mas no meu código real, estou lidando com vetores que têm várias implementações cada, com até quatro dimensões (x, y, z ew). Atualmente, tenho mais de 2.000 linhas de código, embora cada vetor precise realmente de 500.
Especificando parâmetros em tempo de execução.
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]; } }
Infelizmente, essa solução prejudica o desempenho do código, resulta em um código mais confuso do que a solução anterior e não é tão segura no tempo de compilação (não é possível garantir no tempo de compilação que o vetor com o qual você está lidando é bidimensional, por exemplo).
No momento, estou atualmente desenvolvendo no Xtend, portanto, se houver alguma solução disponível no Xtend, elas também serão aceitáveis.