ऐसी स्थिति पर विचार करें जहां एक वर्ग एक ही मूल व्यवहार, विधियों, एट वगैरह को लागू करता है, लेकिन उस वर्ग के कई अलग-अलग संस्करण विभिन्न उपयोगों के लिए मौजूद हो सकते हैं। मेरे विशेष मामले में, मेरे पास एक वेक्टर (एक ज्यामितीय वेक्टर, एक सूची नहीं) है और वह वेक्टर किसी भी एन-आयामी यूक्लिडियन स्पेस (1 आयामी, 2 आयामी, ...) पर लागू हो सकता है। इस वर्ग / प्रकार को कैसे परिभाषित किया जा सकता है?
यह C ++ में आसान होगा जहां क्लास टेम्प्लेट में पैरामीटर के रूप में वास्तविक मान हो सकते हैं, लेकिन हमारे पास जावा में वह लक्जरी नहीं है।
इस समस्या को हल करने के लिए जिन दो तरीकों के बारे में मैं सोच सकता हूँ, वे हैं:
संकलित समय पर प्रत्येक संभव मामले का कार्यान्वयन।
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; } }
यह समाधान स्पष्ट रूप से बहुत समय लेने वाला और कोड के लिए बेहद थकाऊ है। इस उदाहरण में यह बहुत बुरा नहीं लगता है, लेकिन मेरे वास्तविक कोड में मैं उन वैक्टरों के साथ काम कर रहा हूं जिनमें प्रत्येक के लिए कई कार्यान्वयन हैं, जिनमें चार आयाम (x, y, z, और w) हैं। मेरे पास वर्तमान में 2,000 से अधिक कोड हैं, भले ही प्रत्येक वेक्टर को वास्तव में 500 की आवश्यकता हो।
रनटाइम पर पैरामीटर निर्दिष्ट करना।
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]; } }
दुर्भाग्य से यह समाधान कोड प्रदर्शन को नुकसान पहुंचाता है, पूर्व समाधान की तुलना में गड़बड़ कोड में परिणाम होता है, और संकलन-समय पर उतना सुरक्षित नहीं है (यह संकलन-समय पर गारंटी नहीं दी जा सकती है कि आप जिस वेक्टर के साथ काम कर रहे हैं वह 2-आयामी है, उदाहरण के लिए)।
मैं वर्तमान में Xtend में वास्तव में विकसित कर रहा हूं, इसलिए यदि कोई भी Xtend समाधान उपलब्ध है, तो वे भी स्वीकार्य होंगे।