एंड्रॉइड अधिक एनम का उपयोग क्यों नहीं करता है?


79

मैंने कई कारणों से अपने कोड में वास्तव में C # और जावा एनम का उपयोग करना शुरू कर दिया है:

  • वे पूर्णांक, स्ट्रिंग्स या बूलियन झंडे के सेट की तुलना में बहुत अधिक प्रकार के सुरक्षित हैं।
  • वे अधिक पठनीय कोड की ओर ले जाते हैं।
  • इंटम या स्ट्रिंग की तुलना में अमान्य मान को एनम सेट करना अधिक कठिन है।
  • वे एक चर या पैरामीटर के लिए अनुमत मानों की खोज करना आसान बनाते हैं।
  • मैंने जो कुछ पढ़ा है वह इंगित करता है कि वे सी # और अधिकांश जेवीएम में पूर्णांक के साथ-साथ पूर्ण प्रदर्शन करते हैं।

हालाँकि, एंड्रॉइड फ्रेमवर्क में कई मामले हैं जहां विभिन्न प्रकार के झंडे को पास करने की आवश्यकता होती है, लेकिन उनमें से कोई भी इनम का उपयोग नहीं करता है। उदाहरण के एक जोड़े को मैं कहाँ लगता होगा उनके उपयोग लाभप्रद होगा रहे हैं Toast.LENGTH_SHORT/ Toast.LENGTH_LONGऔर View.GONE, View.VISIBLEआदि

ऐसा क्यों है? क्या डालम्विक में सरल पूर्णांक मानों से भी बदतर प्रदर्शन करते हैं? क्या कुछ और कमियां हैं जिनकी मुझे जानकारी नहीं है?


10
अब एनम का उपयोग करना ठीक है। देखें stackoverflow.com/questions/5143256/...
थियरी-दिमित्री रॉय

1
महान! मुझे ईर्ष्या पसंद है और मैं उन्हें अभी तक बाहर निकालने के लिए आस-पास नहीं गया था।
वी आर ऑल मोनिका

जवाबों:


66

यह उत्तर मार्च 2011 तक पुराना है।

एंड्रॉइड वीएम टीम (और उसके ब्लॉग ) के एक सदस्य से एंड्रॉइड के प्रदर्शन युक्तियों से हटाए गए इस उत्तर के अनुसार एनोम्स का उपयोग फ्रायो और ऊपर किया जा सकता है ( क्यों "से बचें जहां आपको केवल आवश्यकताएं होती हैं"? )।


पिछला उत्तर:

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

एनम बहुत सुविधाजनक हैं, लेकिन आकार और गति के मामले में दुर्भाग्य से दर्द हो सकता है। उदाहरण के लिए, यह:

public enum Shrubbery { GROUND, CRAWLING, HANGING }

तीन सार्वजनिक स्थैतिक अंतिम ints के साथ समकक्ष वर्ग की तुलना में आपकी .dex फ़ाइल में 740 बाइट्स जोड़ता है। पहले उपयोग पर, क्लास इनिशियलाइज़र प्रत्येक प्रगणित मानों का प्रतिनिधित्व करने वाली वस्तुओं पर विधि लागू करता है। प्रत्येक ऑब्जेक्ट का अपना स्थिर क्षेत्र होता है, और पूरा सेट एक सरणी ("$ VALUES" नामक एक स्थिर फ़ील्ड) में संग्रहीत होता है। यह कोड और डेटा बहुत है, सिर्फ तीन पूर्णांकों के लिए। इसके अतिरिक्त, यह:

Shrubbery shrub = Shrubbery.GROUND;

एक स्थिर फ़ील्ड लुकअप का कारण बनता है। यदि "GROUND" एक स्थिर अंतिम int था, तो कंपाइलर इसे ज्ञात स्थिरांक के रूप में मानेगा और इसे इनलाइन करेगा।

स्रोत: एनम से बचें जहां आपको केवल स्याही की आवश्यकता होती है


4
इसलिए जब सी # एनम बहुत अच्छा प्रदर्शन करते हैं, जावा एनम तब से नहीं करते हैं क्योंकि वे अधिक जटिल हैं। इसलिए मेरा आखिरी बुलेट पॉइंट वास्तव में सही नहीं है। सही बात?
वी आर ऑल मोनिका

25
यह शायद अब मान्य नहीं है, देखें stackoverflow.com/questions/5143256/…
विक्टर डाहल

2
एंड्रॉइड डॉक्यूमेंटेशन अभी भी एनम का उपयोग नहीं करने की सलाह देता है: "एनमेट्स को अक्सर स्थिर स्थिरांक के रूप में दो बार से अधिक मेमोरी की आवश्यकता होती है। आपको एंड्रॉइड पर एनम का उपयोग करने से सख्ती से बचना चाहिए।" developer.android.com/training/articles/memory.html#Overhead
थॉमस

1
@ SebastianPaaskeTørholm आपके द्वारा प्रदान किया गया लिंक (यह: developer.android.com/guide/practices/design/… ) अब टिप नहीं दिखाता है।
एंड्रॉइड डेवलपर

14

पूर्णांक छोटे होते हैं, और कम ओवरहेड की आवश्यकता होती है, ऐसा कुछ जो अभी भी मोबाइल उपकरणों पर मायने रखता है।


इसके अलावा अब हमारे पास Android Studio और Lint के लिए अच्छा टूल है। मेरा मतलब है एनोटेशन IntDefऔर StringDef, जो किसी प्रकार के टाइपफेड को घोषित करने की अनुमति देता है , इसलिए इंट कॉन्स्टेंट का उपयोग बहुत सुविधाजनक है। blog.shamanland.com/2016/02/int-string-enum.html
K.

हाँ, लेकिन क्या रेट्रोफिट मॉडल के बारे में? (और अन्य नेटवर्क पुस्तकालयों के लिए) मुझे लगता है कि आप सीधे POJO को मैप करने के लिए एक स्थिति प्रतिक्रिया (जैसे सफल, असफल, टोकन_प्रकाशित) को कैसे परिभाषित करेंगे?
9

5

इस स्थिति के संबंध में मेरे एक सहयोगी ने एक छोटा परीक्षण किया। उन्होंने कहा कि ऑटो एक उत्पन्न classऔर एक enum"enums" का एक ही राशि के साथ। मेरा मानना ​​है कि उसने 30000 प्रविष्टियाँ उत्पन्न कीं।

परिणाम थे:

  • .classके लिए classलगभग 1200KB था
  • .classके लिए enumलगभग 800KB था

आशा है कि यह किसी की मदद करता है।


मुझे नहीं लगता कि यह वैध परीक्षण है। एक ही स्थान पर 30000 enums / static फ़ील्ड्स होना यथार्थवादी परिदृश्य नहीं है। आपको बड़ी संख्या में छोटे वर्गों / एनमों के आकार की तुलना करने की आवश्यकता होगी, जैसे 1000 वर्ग / एनम 30 गुण प्रत्येक। मुझे विश्वास है कि कुल आकार काफी अलग होगा।
Iwo Banas

7
@ इवो बनास कोई भी परीक्षण एक वैध परीक्षा है। यह सवाल का जवाब होगा नहीं कहा। बस इसे दिलचस्पी रखने वाले किसी भी व्यक्ति के लिए अतिरिक्त जानकारी के रूप में पेश किया। और नीचे वोट बहुत योग्य लगता है, इसलिए धन्यवाद। -_-
प्रालिंक ०० Sep१

क्या यह विपरीत नहीं दिखा? वह एनम कम उपयोग करता है? और क्या यह मेमोरी या स्टोरेज 1200KB या 800KB है?
Android डेवलपर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.