2012-09-24 3 views
7

लोग,जावा -

मैं जावा की सबसे अच्छी कोडिंग यहाँ
http://viralpatel.net/blogs/most-useful-java-best-practice-quotes-java-developers/

2 उद्धरण कहते हैं उल्लेख किया प्रथाओं के माध्यम से जा रहा था,

उद्धरण 2 गेटर विधि के अंदर संपत्ति क्लोन: कभी नहीं एक बनाने के क्लास पब्लिक के उदाहरण फ़ील्ड

मैं मानता हूं कि यह बिल्कुल सही है, लेकिन मैं लेखक के अनुशंसा के बाद इस उद्धरण के नीचे कुछ पंक्तियों के लिए अटक गया।

वे कहते हैं,


private String[] weekdays = 
    {"Sun", "Mon", "Tue", "Thu", "Fri", "Sat", "Sun"}; 

public String[] getWeekdays() { 
    return weekdays; 
} 

लेकिन गेटर विधि लेखन वास्तव में हमारी समस्या का समाधान नहीं होता। सरणी अभी भी सुलभ है। इसे अपरिवर्तनीय बनाने का सबसे अच्छा तरीका है सरणी के बजाय सरणी के क्लोन को वापस करना। इस प्रकार गेटर विधि

public String[] getWeekdays() { 
    return weekdays.clone(); 
} 

मैं कभी नहीं अपने आप को जावा वर्ग के किसी भी गेटर विधि के अंदर clone() इस्तेमाल किया में बदल जायेगा।

मैं सोच रहा हूँ (के रूप में यह अच्छी प्रथाओं से एक होने का उल्लेख किया गया है) - क्यों एक should use/shouldn't useclone() गेटर विधि के अंदर? और किस परिदृश्य में?

क्या यह जावा के लिए एक अच्छा कोडिंग अभ्यास होने योग्य है?

धन्यवाद

+2

आईएमओ - अपरिवर्तनीय वस्तुओं और आदिम डेटा प्रकार क्लोन की आवश्यकता नहीं है। बाकी सब कुछ के लिए यदि हम वास्तव में अपने डेटा को सुरक्षित रखना चाहते हैं तो हमें क्लोन प्रतिलिपि वापस करनी होगी, न कि मूल। –

+2

आप 'Arrays.asList (सप्ताहांत)' वापस कर सकते हैं, जो अपरिवर्तनीय होगा। – Jivings

+2

@Jivings सच नहीं है। सूची नए तत्वों को स्वीकार नहीं करेगी, लेकिन सेट() विधियां काम करती हैं। –

उत्तर

3
private String[] weekdays =  
    {"Sun", "Mon", "Tue", "Thu", "Fri", "Sat", "Sun"}; 

public String[] getWeekdays() 
{  
    return weekdays; 
} 

आप clone विधि का उपयोग नहीं करते हैं, इस वर्ग के उपयोगकर्ता अनैतिक बहुत कुछ कर सकते हैं:

  1. परिवर्तन दिनों के आदेश,
  2. परिवर्तन दिनों का नाम,
  3. ...

लेकिन, एक क्लोन लौटने से कक्षा और उसके डेटा को प्रभावित नहीं होगा। तो, कक्षा के अन्य उपयोगकर्ता प्रभावित नहीं होंगे।

+0

लेकिन मुझे पहले किसी भी वेबसाइट पर क्लोन() विधि अनुशंसा नहीं मिली। मैंने अधिकांश प्रोग्रामर (यहां तक ​​कि कुछ जावा गीक्स) को उनके उदाहरणों में उपयोग नहीं किया। मुझे संदेह है, अगर यह एक अच्छा कोडिंग अभ्यास है तो? : ओ –

+0

@ बोम्सलंग आपकी आवश्यकताओं को बहुत कम कर देगा। जैसा कि अज़ोडियस ने इंगित किया है, क्लोनिंग (डेटा की किसी अन्य प्रति को साबित करने) से आपकी कक्षा के लिए अप्रत्याशित समस्याएं हो सकती हैं, लेकिन आपको यह तय करने की आवश्यकता है कि यह वह व्यवहार है जो आप चाहते हैं। कारण शायद आप इसे नहीं देखते हैं क्योंकि यह ज्यादातर लोगों के लिए अधिक टाइपिंग है। यदि आप स्विंग एपीआई में एक नज़र रखते हैं, तो आप 'आयाम' वापस लौटने पर बहुत सारे सिमुलेशन प्रथाओं को देखते हैं, कक्षा अक्सर उस नए वर्ग के बीज के रूप में आंतरिक संदर्भ का उपयोग करके एक नया 'आयाम' ऑब्जेक्ट बनायेगी, अनिवार्य रूप से, इसे क्लोनिंग – MadProgrammer

+2

हां, यह है। और व्यक्तिगत रूप से मैंने इसे आपके उदाहरण के समान लगभग एक मामले में उपयोग किया है। लेकिन अगर किसी भारी वस्तु को क्लोन किया जाता है तो इसका उपयोग अंधेरे से नहीं किया जाना चाहिए, इससे स्मृति के मुद्दों का कारण बन जाएगा। तो, केवल उस डेटा को क्लोन करें जिसे उपयोगकर्ता को संशोधित नहीं करना चाहिए। – Azodious

2

get() पर यदि आप गारंटी चाहते हैं कि संपूर्ण ऑब्जेक्ट ग्राफ़ (जिसमें सरणी है) अपरिवर्तनीय है। ऐसा आमतौर पर किया जाता है जब सरणी का खुलासा करने वाला एपीआई सार्वजनिक होता है और सरणी में मानों पर बाधाएं होती हैं या ऑब्जेक्ट्स को एकाधिक थ्रेड द्वारा एक्सेस किया जाता है। ऐसे मामलों में अपरिवर्तनीयता महत्वपूर्ण है।

मान लें कि आपके पास GroceryStore ऑब्जेक्ट है जिसमें getItemsSortedByPrice() विधि है। आप आइटम को सरणी में रखते हैं जो ऑर्डर को कीमत से बनाए रखता है, लेकिन यदि आप इस सरणी को वापस करते हैं, तो क्लाइंट कोड संभवतः इसे संशोधित कर सकता है और आपके ऑब्जेक्ट के आंतरिक (आंतरिक) इनवेंटर्स को तोड़ सकता है।

यदि यह आंतरिक कोड (यानी) सार्वजनिक एपीआई का हिस्सा नहीं है, और आप जानते हैं कि आप सरणी को संशोधित नहीं करेंगे, तो शायद क्लोनिंग/प्रतिलिपि बनाना आवश्यक नहीं है क्योंकि यह वास्तविक लाभ के बिना प्रदर्शन को नुकसान पहुंचाता है।

सभी संदर्भ पर निर्भर करता है।

Arrays केवल ऑब्जेक्ट्स हैं, और सभी (आईएम) एक सामान्य वस्तु पर लागू होने वाले उत्परिवर्तन नियम/प्रथाएं, सरणी पर भी लागू होती हैं।

+1

+1 System.arrayCopy के लिए +1 (), हालांकि मैं अधिक उपयोग करने योग्य संस्करण Arrays.copyOf() (जो निश्चित रूप से System.arrayCopy() आंतरिक रूप से उपयोग करता है) की अनुशंसा करता हूं –

1

मुझे लगता है कि आपका उपयोगकेस प्रस्तावित जावा कोड से मेल नहीं खाता है। उदाहरण आपके मुकाबले एक अलग प्रयोग के लिए है।

एक अंतिम सरणी मुझे Enums की तरह लगता है और मुझे लगता है कि यह आपकी आवश्यकता से काफी बेहतर है।

5

यह यहोशू बलोच द्वारा पुस्तक "प्रभावी जावा" में चर्चा की है। नामक एक अनुभाग है "आवश्यकता होने पर रक्षात्मक प्रतियां बनाएं" (द्वितीय संस्करण में धारा 3 9)।

मुझे लगता है कि Google पुस्तकें आपको अनुभाग का पूर्वावलोकन देखने दे सकती हैं।

इस तरह के विषयों पर रहने के लिए एक अच्छी किताब।