यहां लघु संस्करण है। सबसे पहले और सबसे महत्वपूर्ण: मैं चाहता हूं कि मेरी कक्षा अपरिवर्तनीय हो। मुझे पता है कि एक वर्ग सार और अंतिम दोनों नहीं हो सकता है। मैं जो पूछ रहा हूं वह है: क्या केवल का कोई तरीका है आंतरिक कक्षाओं को बाहरी, अमूर्त वर्ग को विस्तार और कार्यान्वित करने की अनुमति देता है? यह मेरे अपरिवर्तनीय लक्ष्यों को प्राप्त करने का सबसे अच्छा तरीका नहीं हो सकता है, इसलिए यदि किसी के पास बेहतर डिज़ाइन है, तो मुझे यह सुनना अच्छा लगेगा।कोई एक अमूर्त, अपरिवर्तनीय वर्ग कैसे बना सकता है?
मैं वेक्टर परिचालनों के लिए एक कक्षा लिख रहा हूं - भौतिकी और इंजीनियरिंग में, प्रोग्रामिंग भावना नहीं। (मैं भी पता है कि सामान के इस प्रकार के लिए JScience has a package। मैं अपने खुद के बारे में है, और यह सरल बनाए रखना चाहते हूँ।)
मैं जावा के ज्यामिति पैकेज में इस्तेमाल किया पद्धति की तरह, जिसमें, कहते हैं, एक Line2D
बनाया जा सकता है दो परिशुद्धता स्तरों में से एक का उपयोग करना: फ्लोट या डबल।
public abstract class Line2D {
public static class Float extends Line2D { /* Implementation */ }
public static class Double extends Line2D { /* Implementation */ }
}
यह मैं वास्तव में मेरी कक्षा में शामिल और उनका विस्तार करना चाहते हैं एक विशेषता है, इसलिए मैं निम्नलिखित बनाया:
public abstract class Vector2D {
public final static class Integer extends Vector2D {
// Component length projected along x/y axis, respectively
final private int i, j;
public Integer(int i, int j) {
this.i = i;
this.j = j;
}
public Object doStuff() { /* vector operations */ }
}
public final static class Float extends Vector2D {
// Identical to Vector2D.Integer, except with floats
}
public final static class Double extends Vector2D { /* Same Idea */ }
// Outer class methods and whatnot
}
जाहिर है, Vector2D.Integer
, Vector2D.Float
, और Vector2D.Double
सभी अंतिम कर रहे हैं। क्या इन आंतरिक कक्षाओं को छोड़कर Vector2D
सब कुछ करने के लिए अंतिम तरीका है?
वैसे - क्या आप इसके लिए जेनिक्स का उपयोग नहीं कर सकते? अधिकांश परिचालनों के साथ उनके साथ काम करना चाहिए और यह वेक्टर के बजाय वेक्टर लिखने के लिए अधिक मूर्खतापूर्ण है। इंटेगर ... फिर आपको चारों ओर कास्टिंग करने की आवश्यकता नहीं होगी ... –
Falco
@ फाल्को प्रदर्शन आवश्यकताओं के आधार पर, मुक्केबाजी/अनबॉक्सिंग रूपांतरण (दुर्भाग्य से अभी भी) निषिद्ध रूप से महंगा हो सकता है (आखिरी लेकिन कम से कम लाखों 'डबल' उदाहरणों द्वारा निहित संभावित कचरे के कारण नहीं। इसके विशेषज्ञों के लिए एक कारण है, उदाहरण के लिए, जावा 8 में 'स्ट्रीम' को 'डबलस्ट्रीम' के रूप में 'स्ट्रीम करें ...) – Marco13