Pertimbangkan situasi di mana kelas mengimplementasikan perilaku dasar yang sama, metode, dan lain-lain, tetapi beberapa versi berbeda dari kelas itu bisa ada untuk penggunaan yang berbeda. Dalam kasus khusus saya, saya memiliki vektor (vektor geometris, bukan daftar) dan vektor itu dapat berlaku untuk ruang Euclidean N-dimensi (1 dimensi, 2 dimensi, ...). Bagaimana kelas / tipe ini dapat didefinisikan?
Ini akan mudah di C ++ di mana templat kelas dapat memiliki nilai aktual sebagai parameter, tetapi kami tidak memiliki kemewahan di Jawa.
Dua pendekatan yang dapat saya pikirkan yang dapat diambil untuk menyelesaikan masalah ini adalah:
Memiliki implementasi dari setiap kasus yang mungkin pada waktu kompilasi.
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; } }
Solusi ini jelas sangat memakan waktu dan sangat membosankan untuk kode. Dalam contoh ini sepertinya tidak terlalu buruk, tetapi dalam kode saya yang sebenarnya saya berurusan dengan vektor yang masing-masing memiliki beberapa implementasi, dengan hingga empat dimensi (x, y, z, dan w). Saat ini saya memiliki lebih dari 2.000 baris kode, meskipun setiap vektor hanya membutuhkan 500.
Menentukan parameter saat runtime.
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]; } }
Sayangnya solusi ini merusak kinerja kode, menghasilkan kode yang lebih berantakan daripada solusi sebelumnya, dan tidak aman pada saat kompilasi (tidak dapat dijamin pada waktu kompilasi bahwa vektor yang Anda hadapi sebenarnya adalah 2-dimensi, sebagai contoh).
Saya saat ini benar-benar berkembang di Xtend, jadi jika ada solusi Xtend yang tersedia, mereka juga dapat diterima.