2011-05-19 12 views
18

this video from Google IO 2009 में, प्रस्तुतकर्ता बहुत जल्दी कहता है कि तरीकों के हस्ताक्षर इंटरफेस के बजाय ठोस प्रकार लौटाएंगे।जीडब्ल्यूटी में, एक विधि को इंटरफ़ेस क्यों नहीं देना चाहिए?

जो मैंने वीडियो में सुना है, उससे जीडब्ल्यूटी जावा-टू-जावास्क्रिप्ट कंपाइलर के साथ कुछ करना है।

  • इस विकल्प के पीछे क्या कारण है?
  • विधि हस्ताक्षर में इंटरफ़ेस कंपाइलर को क्या करता है?
  • कंक्रीट प्रकारों के बजाय इंटरफेस वापस कौन से तरीके वापस कर सकते हैं, और जो कंक्रीट उदाहरण लौटने से बेहतर हैं?

Snippet of code from Google IO presentation showing it's better that your method returns ArrayList than List

+0

इसे आरपीसी क्रमबद्धरण के साथ करना है। Http://stackoverflow.com/questions/3059787/gwt-using-listerializable-in-a-rpc-call –

+0

प्रस्तुति में 7 मिनट के बिंदु को देखें या उसके बाद देखें। वक्ता को नहीं पता कि वह ऐसा क्यों कर रहा है।वह इसे 'अंधविश्वास' कहते हैं। –

उत्तर

16

यह gwt-संकलक के साथ क्या करना है, तो आप सही ढंग से कहते हैं कि के रूप में है। संपादित करें: हालांकि, जैसा कि डैनियल ने नीचे एक टिप्पणी में उल्लेख किया है, यह सामान्य रूप से gwt-compiler पर लागू नहीं होता है, लेकिन केवल GWT-RPC का उपयोग करते समय।

आप वापसी प्रकार के रूप में ArrayList के बजाय सूची की घोषणा करते हैं, तो gwt-संकलक पूरी सूची-पदानुक्रम में शामिल होंगे (अर्थात सभी प्रकार सूची को लागू करने) अपने संकलित कोड में। यदि आप ऐरेलिस्ट का उपयोग करते हैं, तो कंपाइलर को केवल ऐरेलिस्ट सूची पदानुक्रम (यानी सभी प्रकारों को एरेलेलिस्ट को लागू करने की आवश्यकता होगी - जो आमतौर पर केवल ऐरेलिस्ट ही होती है)। एक ठोस वर्ग के बजाय एक इंटरफ़ेस का उपयोग करके आप संकलित समय और आपके जेनरेट कोड के आकार में (और इस प्रकार प्रत्येक उपयोगकर्ता को आपके ऐप को चलाने के दौरान डाउनलोड करने के लिए कोड की मात्रा) के मामले में जुर्माना अदा करेगा।

आप कारण भी मांग रहे थे: यदि आप इंटरफ़ेस (कंक्रीट क्लास के बजाए) का उपयोग करते हैं तो संकलक संकलन समय पर नहीं जानता है कि इन इंटरफेस के कार्यान्वयन का उपयोग किया जा रहा है। इस प्रकार, इसमें सभी संभावित कार्यान्वयन शामिल हैं।

अपने अंतिम प्रश्न के संबंध में: सभी विधियों को इंटरफ़ेस वापस करने के लिए घोषित किया जा सकता है (यही वह है जो आप जानते हैं, है ना?)। हालांकि, उपर्युक्त जुर्माना लागू होता है।

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

संक्षेप में: जब भी संभव हो ठोस कंक्रीट कक्षाओं का उपयोग करें। (। छोटे सुझाव: अगर आप समय स्टाम्प दिया है जब आप एक वीडियो को देखें यह मदद मिलेगी)

- High-performance GWT

+7

कोड ब्लोट केवल कोड जनरेशन (उदाहरण के लिए जीडब्ल्यूटी-आरपीसी) के साथ उपयोग की जाने वाली कक्षाओं के लिए है। आम तौर पर कंपाइलर इंटरफेस –

+0

** डैनियल का उपयोग करते समय ब्लोट नहीं करता है ** आप सही हैं! ** मैं पूरी तरह से भूल गया कि कोई भी जीडब्ल्यूटी-आरपीसी के बिना जीडब्ल्यूटी का उपयोग कर सकता है। – Stefan

+0

@danielkurka - क्या आपको पता है कि क्या यह जीडब्ल्यूटी-आरपीसी इंटरफेस ब्लोट अभी भी जीडब्ल्यूटी के हाल के संस्करणों में एक मुद्दा है? –

2

यह और अन्य प्रदर्शन टिप्स गूगल आईओ 2011 प्रस्तुत किए गए। किसी कारण मैंने सोचा था कि GWT संकलक दूर इसे फिर से अनुकूलन होगा के लिए #4 Watch out for RPC type explosion

लेकिन ऐसा लगता है मैं गलत था:

7 मिनट बिंदु के बारे में एटी पते 'आरपीसी प्रकार धमाका' बोलते हैं।

+0

क्या यह अभी भी 2.8.0 के लिए सच है? – displayname

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