2015-02-09 20 views
5

यह सिर्फ एक अकादमिक सीखने के दृष्टिकोण से है। संदर्भ वस्तु के निर्माण के दौरान निकल जाता है नहीं करता है - - यह अंतिम आदिम क्षेत्रों से मिलकर किया है - सभी मुझे पता है कि जब भी हम कुछ वर्ग अपरिवर्तनीय, बनाना चाहते है अगर अन्य वस्तुओं का उपयोग करता है, तो उन वस्तुओं भी रिकर्सिवली अपरिवर्तनीय होने की जरूरत है या कुछ अन्य विस्तृत लुकआउट्स के बीच java.lang.String जैसे एपीआई अपरिवर्तनीय वर्ग!इसमें कक्षा वस्तु के साथ अपरिवर्तनीय कक्षा कैसे बनाएं?

लेकिन मैं हाल ही में एक प्रश्न करवाते आया जिसमें एक साक्षात्कारकर्ता एक उम्मीदवार से पूछा अपरिवर्तनीय वर्ग उस में एक java.util.Date है कि बनाने के लिए। मेरी पहली छाप बताती है कि यह संभव नहीं है हालांकि हम स्ट्रिंग के साथ वर्कअराउंड कर सकते हैं जिसमें तारीख ऑब्जेक्ट की बजाय डेट स्ट्रिंग है।

कृपया मुझे इस पर स्पष्टीकरण दें। धन्यवाद।

+1

फील्ड्स अपरिवर्तनीय प्रकार होने की जरूरत नहीं है अंदर सेट कर दिया जाता है, वे सिर्फ उत्परिवर्तित नहीं किया जा सकता। –

+0

सरल इसे (कक्षा) अंतिम बनाओ !!! –

+1

और आपका प्रश्न क्या है? आप उस क्षेत्र के साथ समस्याएं कहां देखते हैं जो 'दिनांक' प्रकार' है? यह प्रोग्रामर पर निर्भर करता है अगर वह कक्षा को कॉल करने के लिए इस दिनांक के उदाहरण को पास करता है। उसे ऐसा करने के लिए मजबूर नहीं किया जाता है और इसलिए इस तरह के क्षेत्र में कोई समस्या नहीं है। – Tom

उत्तर

15

सरल बात के लिए विचार करें this tutorial वर्ग अपरिवर्तनीय बनाने के लिए यहाँ करने के लिए (जब यह निर्माण मानकों में पारित हो जाता है) तिथि वस्तु का एक बचाव की मुद्रा में प्रतिलिपि बनाने के लिए है। फिर किसी भी सेटर्स भी प्रदान न करें। इस तरह कक्षा में दिनांक फ़ील्ड का कोई संदर्भ इस वर्ग के बाहर कोड के लिए दृश्यमान नहीं है और इस प्रकार तिथि को संशोधित नहीं किया जा सकता है। आवश्यक गेटर विशेषता के लिए

टॉम देखें टिप्पणी! इसके अलावा धन्यवाद।

(। मनुष्य के रूप में अच्छी तरह से दिनांक फ़ील्ड की एक प्रति लौटना चाहिए, के बाद से दिनांक ही परिवर्तनशील है, और गेटर से लौटे क्षेत्र बदलते वर्ग के क्षेत्र के साथ-साथ बदल जाएगा)

अधिक जानकारी और जानकारी के लिए: http://www.informit.com/articles/article.aspx?p=31551&seqNum=2

+5

और यदि 'सार्वजनिक दिनांक getDate() {} 'जैसी गेटर विधि होने की आवश्यकता है, तो वहां एक प्रतिलिपि भी बनाएं:' नई तिथि (PrivateDate.getTime());'। – Tom

+0

उत्तर दिए गए लिंक के साथ सही है ... रक्षात्मक प्रति खूबसूरती से समझाया गया है। – minhas23

+1

सामान को लागू करते समय, मुझे लगता है कि बेहतर विकल्प स्वरूपित दिनांक या epochToDate के लिए लंबे चर के लिए स्ट्रिंग का उपयोग करना था। – xploreraj

5

मैं तिथि है जो आप उपयोग कर रहे हैं चारों ओर एक आवरण वर्ग बनाने के लिए सुझाव देते हैं और किसी भी setters या किसी विधि है जो वास्तव में मूल्य बदल सकते हैं प्रदान करते हैं न।

यह अपरिवर्तनीय बनाने के लिए आप निम्नलिखित बातों पर विचार करने की जरूरत है:

  1. आप उस वर्ग अधिरोहित नहीं किया जा सकता है सुनिश्चित करने की आवश्यकता है - यह अंतिम रूप हैं।
  2. सभी क्षेत्रों को निजी और अंतिम के रूप में बनाएं।
  3. कोई भी सेटर्स या कोई विधि प्रदान न करें जो इंस्टेंस चर बदलता है।
  4. बचाव नकल कॉल प्राप्त करने वाला और फोन करने वाले के बीच वस्तुओं।

    अधिक

+1

या तो, या दिनांक –

+1

की एक प्रति वापस एक रैपर से परेशान क्यों करें? बस एक (निजी) प्रतिलिपि बनाएं, और फिर * इसे संशोधित न करें। –

+1

* गैर-आदिम उत्परिवर्तनीय क्षेत्रों * की रक्षात्मक प्रतियां *। – TheLostMind

0

1) "सेटर" विधियां प्रदान न करें।

2) बनाओ सभी क्षेत्रों अंतिम और निजी

3) उपवर्गों तरीकों ओवरराइड करने के लिए अनुमति न दें - के रूप में अंतिम

4) वर्ग घोषित परिवर्तनशील उदाहरण चर के लिए - पूर्व की तारीख: इस मामले में एक विशेष ध्यान दिया जाना चाहिए।

5) निर्माता निजी बनाएं और कारखाने के तरीकों में उदाहरणों का निर्माण। ऑब्जेक्ट निर्माण तर्क को एकल स्थान पर संग्रहीत करने के लिए फैक्टरी विधि।

public static MyImmutableClass createNewInstance(Integer fld1, String fld2, Date date) 
{ 
    return new MyImmutableClass (fld1, fld2, date); 
} 

6) इसके बजाय प्रतिलिपि बनाई गई सामग्री के साथ एक नई तिथि वस्तु वापस लौटा दी जानी चाहिए।

public Date getDateField() { 
    return new Date(dateField.getTime()); 
} 

- यहाँ dateField क्षेत्र है जो निजी निर्माता

संबंधित मुद्दे