मैं बहुत बूढ़ा हो गया हूं। मैं वहां गया और इसे देखा और कई बार इसके बारे में अपना सिर पीटा।
मैं हर्स्ले पार्क में एक सम्मेलन में था, जहां आईबीएम लड़के हमें बता रहे थे कि यह ब्रांड जावा की नई भाषा कितनी शानदार थी, केवल किसी ने पूछा ... इन वस्तुओं के लिए कोई विध्वंसक क्यों नहीं है। वह उस चीज से मतलब नहीं था जिसे हम C ++ में एक विध्वंसक के रूप में जानते हैं, लेकिन कोई फाइनल भी नहीं था (या इसमें अंतिम रूप था लेकिन वे मूल रूप से काम नहीं करते थे)। यह वापस रास्ता है, और हमने तय किया कि जावा उस बिंदु पर एक खिलौना भाषा का एक सा था।
अब उन्होंने भाषा की युक्ति में फाइनल जोड़ा और जावा ने कुछ अपनापन देखा।
बेशक, बाद में सभी को अपनी वस्तुओं पर अंतिम रूप नहीं देने के लिए कहा गया था क्योंकि इससे जीसी धीमा हो गया। (क्योंकि इसमें न केवल ढेर को लॉक करना था, बल्कि टू-फाइनल की गई वस्तुओं को एक अस्थायी क्षेत्र में ले जाना था, क्योंकि इन तरीकों को नहीं कहा जा सकता था क्योंकि जीसी ने ऐप को चलने से रोक दिया था। इसके बजाय उन्हें अगले से पहले तुरंत बुलाया जाएगा। जीसी चक्र) (और इससे भी बदतर, कभी-कभी अंतिम रूप से कभी भी कॉल नहीं किया जाएगा जब ऐप बंद हो रहा था। कल्पना करें कि आपकी फ़ाइल हैंडल बंद नहीं है, कभी भी)।
तब हमारे पास C # था, और मुझे MSDN पर चर्चा मंच याद है जहाँ हमें बताया गया था कि यह नई C # भाषा कितनी शानदार थी। किसी ने पूछा कि कोई निर्धारण अंतिम क्यों नहीं था और एमएस लड़कों ने हमें बताया कि हमें ऐसी चीजों की आवश्यकता कैसे नहीं है, तो हमें बताया कि हमें अपने डिजाइनिंग एप्लिकेशन के तरीके को बदलने की जरूरत है, फिर हमें बताया कि जीसी कितना अद्भुत था और हमारे सभी पुराने ऐप कैसे थे सभी परिपत्र संदर्भों के कारण बकवास और कभी काम नहीं किया। तब उन्होंने दबाव डाला और हमें बताया कि उन्होंने इस आईडी पैटर्न को उस युक्ति से जोड़ा है जिसका हम उपयोग कर सकते हैं। मैंने सोचा था कि उस समय C # ऐप्स में हमारे लिए मैन्युअल मेमोरी मैनेजमेंट का होना बहुत ही शानदार था।
बेशक, एमएस लड़कों को बाद में पता चला कि उन्होंने जो कुछ भी हमें बताया था ... ठीक है, उन्होंने सिर्फ एक मानक इंटरफ़ेस की तुलना में आईडीसिस को थोड़ा अधिक बनाया, और बाद में उपयोग कथन को जोड़ा। W00t! उन्होंने महसूस किया कि निर्धारक अंतिमकरण भाषा से सब के बाद गायब था। बेशक, आपको अभी भी इसे हर जगह रखना याद है, इसलिए इसका अभी भी थोड़ा सा मैनुअल है, लेकिन यह बेहतर है।
तो उन्होंने ऐसा क्यों किया, जब वे शुरू से ही प्रत्येक स्कोप ब्लॉक पर स्वचालित रूप से रखे गए शैली-शब्दार्थ का उपयोग कर सकते थे। शायद दक्षता, लेकिन मुझे लगता है कि वे सिर्फ एहसास नहीं था पसंद है। जैसे अंततः उन्हें एहसास हुआ कि आपको अभी भी .NET (google SafeHandle) में स्मार्ट पॉइंटर्स की आवश्यकता है, उन्होंने सोचा कि GC वास्तव में सभी समस्याओं का समाधान करेगा। वे यह भूल गए कि एक वस्तु केवल स्मृति से अधिक है और जीसी को मुख्य रूप से स्मृति प्रबंधन को संभालने के लिए डिज़ाइन किया गया है। वे इस विचार में फंस गए कि जीसी इसे संभाल लेगा, और यह भूल गया कि आपने अन्य सामान वहां रखा है, एक वस्तु सिर्फ स्मृति की एक बूँद नहीं है जो कि अगर आप इसे थोड़ी देर के लिए नहीं हटाते हैं तो कोई फर्क नहीं पड़ता।
लेकिन मुझे यह भी लगता है कि मूल जावा में एक अंतिम विधि की कमी इसके लिए थोड़ी अधिक थी - कि आपके द्वारा बनाई गई वस्तुएं सभी स्मृति के बारे में थीं, और यदि आप कुछ और हटाना चाहते थे (जैसे कि डीबी हैंडल या सॉकेट या जो भी हो ) तो आप इसे मैन्युअल रूप से करने की उम्मीद कर रहे थे ।
याद रखें जावा को एम्बेडेड वातावरण के लिए डिज़ाइन किया गया था, जहां लोगों को बहुत सारे मैनुअल आवंटन के साथ सी कोड लिखने के लिए उपयोग किया जाता था, इसलिए स्वत: मुक्त नहीं होना एक समस्या नहीं थी - उन्होंने इसे पहले कभी नहीं किया था, इसलिए आपको जावा में इसकी आवश्यकता क्यों होगी? मुद्दा थ्रेड्स या स्टैक / हीप के साथ करने के लिए कुछ भी नहीं था, यह संभवतः मेमोरी आवंटन (और इसलिए डी-आवंटन) को थोड़ा आसान बनाने के लिए था। सभी में, कोशिश / अंत में बयान गैर-स्मृति संसाधनों को संभालने के लिए संभवतः एक बेहतर जगह है।
तो IMHO, जिस तरह से .NET ने बस जावा की सबसे बड़ी खामी को कॉपी किया है, वह इसकी सबसे बड़ी कमजोरी है। .NET एक बेहतर C ++ होना चाहिए था, एक बेहतर जावा नहीं।