Bir sınıfın aynı temel davranışı, yöntemleri, vb. Uyguladığı bir durumu düşünün, ancak bu sınıfın farklı kullanımlar için birden çok farklı sürümü mevcut olabilir. Benim özel durumumda, bir vektörüm var (liste değil geometrik bir vektör) ve bu vektör herhangi bir N-boyutlu Öklid uzayına (1 boyutlu, 2 boyutlu, ...) uygulanabilir. Bu sınıf / tür nasıl tanımlanabilir?
Sınıf şablonlarının parametreler olarak gerçek değerlere sahip olabileceği C ++ 'da bu kolay olurdu, ancak Java'da bu lüksümüz yok.
Bu sorunu çözmek için kullanılabileceğini düşünebileceğim iki yaklaşım şunlardır:
Derleme zamanında olası her bir vakanın uygulanması.
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; } }
Bu çözüm açıkça çok zaman alıcıdır ve kodlanması son derece sıkıcıdır. Bu örnekte çok kötü görünmüyor, ancak gerçek kodumda, her biri dört boyuta kadar (x, y, z ve w) birden çok uygulamaya sahip vektörlerle uğraşıyorum. Her bir vektörün sadece 500'e ihtiyacı olmasına rağmen şu anda 2.000'den fazla kod satırım var.
Çalışma zamanında parametrelerin belirtilmesi.
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]; } }
Ne yazık ki bu çözüm, kod performansını incitir, önceki çözümden daha karışık kodla sonuçlanır ve derleme zamanında güvenli değildir (derleme zamanında ele aldığınız vektörün aslında 2 boyutlu olduğu garanti edilemez, Örneğin).
Şu anda Xtend'de gelişiyorum, bu nedenle herhangi bir Xtend çözümü varsa, bunlar da kabul edilebilir.