अपरिवर्तनीय वस्तुओं के लिए इंटरफेस की घोषणा न करें
[संपादित करें] जहाँ प्रश्न में ऑब्जेक्ट डेटा ट्रांसफर ऑब्जेक्ट्स (DTO) या प्लेन ओल्ड डेटा (PODs) का प्रतिनिधित्व करते हैं
क्या यह एक उचित दिशानिर्देश है?
अब तक, मैंने अक्सर सील की गई कक्षाओं के लिए इंटरफेस बनाया है जो अपरिवर्तनीय हैं (डेटा को बदला नहीं जा सकता)। मैंने खुद से सावधान रहने की कोशिश की है कि कहीं भी मैं इंटरफ़ेस का उपयोग न करूं जहां मैं अपरिवर्तनीयता की परवाह करता हूं।
दुर्भाग्य से, इंटरफ़ेस कोड को विकृत करना शुरू कर देता है (और यह सिर्फ मेरा कोड नहीं है जिसके बारे में मैं चिंतित हूं)। आप एक इंटरफ़ेस पास किया जा रहा है, और फिर इसे कुछ कोड को पारित करना चाहते हैं जो वास्तव में यह मान लेना चाहता है कि इसको पारित होने वाली चीज़ अपरिवर्तनीय है।
इस समस्या के कारण, मैं अपरिवर्तनीय वस्तुओं के लिए इंटरफेस की घोषणा नहीं कर रहा हूँ।
यह यूनिट परीक्षण के संबंध में प्रभाव हो सकता है, लेकिन इसके अलावा, क्या यह एक उचित दिशानिर्देश है?
या क्या एक और पैटर्न है जिसका उपयोग मैं "स्प्रेडिंग-इंटरफ़ेस" समस्या से बचने के लिए कर रहा हूं।
(मैं कई कारणों से इन अपरिवर्तनीय वस्तुओं का उपयोग कर रहा हूं: मुख्य रूप से थ्रेड सेफ्टी के लिए क्योंकि मैं बहुत से मल्टी-थ्रेडेड कोड लिखता हूं; लेकिन यह भी है क्योंकि इसका मतलब है कि मैं तरीकों से पारित वस्तुओं की रक्षात्मक प्रतियां बनाने से बच सकता हूं। कोड बहुत सरल हो जाता है। कई मामलों में जब आप जानते हैं कि कुछ अपरिवर्तनीय है - जो आप नहीं करते हैं यदि आपको एक इंटरफ़ेस दिया गया है। वास्तव में, अक्सर आप किसी ऑब्जेक्ट की एक रक्षात्मक प्रतिलिपि को एक इंटरफ़ेस के माध्यम से संदर्भित नहीं कर सकते हैं यदि यह प्रदान नहीं करता है। क्लोन ऑपरेशन या इसे प्रसारित करने का कोई तरीका ...)
[संपादित करें]
वस्तुओं को अपरिवर्तनीय बनाने के इच्छुक मेरे कारणों के लिए बहुत अधिक संदर्भ प्रदान करने के लिए, एरिक लिपर्ट के इस ब्लॉग पोस्ट को देखें:
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
मुझे यह भी इंगित करना चाहिए कि मैं यहां कुछ निचले-स्तर की अवधारणाओं के साथ काम कर रहा हूं, जैसे कि बहु-थ्रेडेड नौकरी कतारों में जोड़-तोड़ / पास किए जाने वाले आइटम। ये मूल रूप से डीटीओ हैं।
इसके अलावा जोशुआ बलोच ने अपनी पुस्तक इफेक्टिव जावा में अपरिवर्तनीय वस्तुओं के उपयोग की सिफारिश की है ।
जाँच करना
प्रतिक्रिया के लिए धन्यवाद, सभी। मैंने आगे बढ़ने और डीटीओ और उनके ilk के लिए इस दिशानिर्देश का उपयोग करने का निर्णय लिया है। यह अब तक अच्छा काम कर रहा है, लेकिन यह केवल एक सप्ताह रहा है ... फिर भी, यह अच्छा लग रहा है।
इससे संबंधित कुछ अन्य मुद्दे हैं जिनके बारे में मैं पूछना चाहता हूं; विशेष रूप से कुछ मैं "डीप या शेलो इम्यूएबिलिटी" कह रहा हूं (नामकरण मैं दीप और शेलो क्लोनिंग से चुराता हूं) - लेकिन यह एक और समय के लिए एक सवाल है।
List<Number>
जो कर सकते हैं Integer
, Float
, Long
, BigDecimal
, आदि ... जो सब के सब खुद को अपरिवर्तनीय हैं।