2012-12-19 19 views
12

जब मैं जावा मानक संस्करण सीख रहा था, तो गेटटर और सेटर फ़ंक्शन अक्सर चर को छिपाने के लिए उपयोग किए जाते थे और उन्हें सीधे पहुंच कम करने के लिए उपयोग किया जाता था। मुझे कई स्रोतों से बताया गया है कि एंड्रॉइड में आपको इन कार्यों का उपयोग नहीं करना चाहिए और केवल चर को संशोधित करना चाहिए। इसका कारण यह है कि एंड्रॉइड में गेटर्स और सेटर्स का उपयोग करते समय ओवरहेड के कारण प्रदर्शन हानि होती है। अधिक मेमोरी उपयोग में परिणाम और सिस्टम को धीमा करना।सेटर और गेटर फ़ंक्शन। एंड्रॉइड में प्रदर्शन ओवरहेड?

क्या इसमें कोई सच है? और यदि वहां है, तो गेटर और सेटर का उपयोग करने के लिए प्रदर्शन हानि क्यों?

+1

[d.android] के अनुसार (http://developer.android.com/training/articles/perf -tips.html # internal_get_set) आपको उनसे बचना चाहिए। अच्छा प्रश्न! हालांकि मुझे आश्चर्यचकित होना चाहिए कि अगर मैं उनके सुझावों का पूरा विपरीत करता हूं तो मेरा ऐप कितना हिट करेगा? –

+0

दस्तावेज़ उनसे बचने के लिए कहते हैं लेकिन मुझे नहीं लगता कि ज्यादातर मामलों में तनाव महत्वपूर्ण है। मैं कभी-कभी कुछ फ़ील्ड का पर्दाफाश करने के लिए उनका उपयोग करता हूं लेकिन आप शायद उन्हें इस धारणा के साथ उपयोग करना चाहें कि वे कुछ ओवरहेड जोड़ते हैं। कॉल को लूप/प्रक्रिया गहन ब्लॉक से बाहर रखें और आपको ठीक होना चाहिए। –

उत्तर

9

दस्तावेज के रूप में here एक गेटर और सेटर का उपयोग करके एंड्रॉइड में एक बुरा विचार है। जैसा कि यह कहता है,

यह एंड्रॉइड पर एक बुरा विचार है। वर्चुअल विधि कॉल महंगे हैं, उदाहरण फ़ील्ड लुकअप से कहीं अधिक है। सामान्य ऑब्जेक्ट-उन्मुख प्रोग्रामिंग प्रथाओं का पालन करना उचित है और सार्वजनिक इंटरफ़ेस में गेटर्स और सेटर्स हैं, लेकिन कक्षा के भीतर आपको हमेशा एक्सेस फ़ील्ड को सीधे रखना चाहिए।

प्रदर्शन here प्रदर्शन के बारे में और जानें।

+6

इसमें जोड़ने के लिए: यह विधि बड़े पैमाने पर * आंतरिक * हो रही है और इस पद्धति का उपयोग करके सेटिंग * विधि * तुच्छ * है। अच्छे प्रोग्रामिंग प्रथाओं के लिए, * बाहरी * मूल्यों को कॉल गेटर्स और सेटर्स के माध्यम से होना चाहिए; और आंतरिक गैर-तुच्छ प्राप्त करने और सेटिंग [DRY] के उद्देश्य के तरीकों के माध्यम से की जानी चाहिए (http://en.wikipedia.org/wiki/Don't_repeat_yourself)। – Eric

+0

@Eric इसके लिए धन्यवाद। – Vinay

4

सेटर्स और गेटर्स के लिए प्रदर्शन हानि नगण्य है। सार्वजनिक क्षेत्र खराब अभ्यास हैं और डेटा encapsulation और जानकारी छिपाने के ऑब्जेक्ट उन्मुख सिद्धांतों का उल्लंघन करते हैं।

एक सेटर या गेटर का उपयोग करने के लिए सीधे एक फ़ील्ड को एक्सेस करने से अधिक संपत्ति कॉल की आवश्यकता होती है। यह कुछ भी नहीं है, इसलिए इसके बारे में चिंता न करें - अच्छे कोड लिखने पर ध्यान दें।

संपादित करें:

यह आम ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग प्रथाओं का पालन करें और getters और setters में है करने के लिए उचित है:

स्पष्ट करने के लिए, यह है कि अन्य पोस्टर के हवाले कर रहे हैं एक ही एंड्रॉयड दस्तावेज़ से है सार्वजनिक इंटरफ़ेस, लेकिन कक्षा के भीतर आपको हमेशा फ़ील्ड तक सीधे पहुंचना चाहिए।

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

+0

डाउनवोट के लिए कोई स्पष्टीकरण? –

+3

जैसा कि @ भूख के उत्तर में बताया गया है, वे प्रदर्शन एंड्रॉइड में तर्कसंगत रूप से "नगण्य" (3-7X धीमी) नहीं हैं, लेकिन अन्यथा आपका उत्तर स्पॉट पर है - क्लास के अंदर सीधी पहुंच, गेटटर/सेटर्स सभी के लिए बाहर, लेकिन छोटी कक्षाओं के लिए । – iagreen

7

गूगल एंड्रॉयड टीम द्वारा प्रदान प्रदर्शन सुझावों के अनुसार:

एक JIT के बिना, प्रत्यक्ष क्षेत्र का उपयोग एक तुच्छ गेटर लागू की तुलना में तेजी 3x के बारे में है। जेआईटी के साथ (जहां प्रत्यक्ष क्षेत्र का उपयोग स्थानीय के रूप में सस्ता है), प्रत्यक्ष क्षेत्र का उपयोग से लगभग 7x तेज है जो एक छोटे से गेटर का आह्वान करता है।

हालांकि मैं सहमत हैं कि एक अच्छा कोडन अभ्यास ज्यादा महत्वपूर्ण है और टीम यह भी कहा कि:

ध्यान दें कि आप ProGuard उपयोग कर रहे हैं, तो आप दोनों दुनिया की वजह से सबसे अच्छा हो सकता है ProGuard आपके लिए एक्सेसर्स इनलाइन कर सकते हैं।

इसलिए मुझे लगता है कि मनुष्य और सेटर उपयोग करने के लिए ठीक है;)

Reference