मेरे अनुभव में, ओवरराइडिंग का एक और केवल एक कारण है Object.finalize()
, लेकिन यह एक बहुत अच्छा कारण है :
finalize()
यदि आप कभी भी इनवॉइस करना भूल जाते हैं, तो त्रुटि लॉगिंग कोड को सूचित करें close()
।
स्थैतिक विश्लेषण केवल तुच्छ उपयोग परिदृश्यों में चूक को पकड़ सकता है, और एक अन्य उत्तर में उल्लिखित संकलक चेतावनी में चीजों का ऐसा सरलीकृत दृष्टिकोण होता है कि आपको कुछ भी गैर-तुच्छ होने के लिए वास्तव में उन्हें अक्षम करना होगा। (मेरे पास किसी भी अन्य प्रोग्रामर की तुलना में अधिक चेतावनी सक्षम है जिसे मैं जानता हूं या जिनके बारे में कभी सुना है, लेकिन मेरे पास बेवकूफ चेतावनी सक्षम नहीं है।)
अंतिम रूप से यह सुनिश्चित करने के लिए एक अच्छा तंत्र प्रतीत हो सकता है कि संसाधन अपरिहार्य रूप से नहीं चलते हैं, लेकिन ज्यादातर लोग इसे पूरी तरह से गलत तरीके से देखते हैं: वे इसे एक वैकल्पिक कमबैक तंत्र के रूप में मानते हैं, एक "दूसरा मौका" सुरक्षा जो स्वचालित रूप से बचाएगा उन संसाधनों का निपटान करके, जिन्हें वे भूल गए। यह गलत है । किसी भी दिए गए कार्य को करने का केवल एक ही तरीका होना चाहिए: या तो आप हमेशा सब कुछ बंद कर दें, या अंतिम रूप से हमेशा सब कुछ बंद हो जाए। लेकिन चूंकि अंतिम रूप अविश्वसनीय नहीं है, इसलिए अंतिम रूप दिया जा सकता है।
इसलिए, यह योजना है जिसे मैं अनिवार्य निपटान कहता हूं , और यह निर्धारित करता है कि प्रोग्रामर हमेशा स्पष्ट रूप से सब कुछ बंद करने Closeable
या लागू करने के लिए जिम्मेदार है AutoCloseable
। (कोशिश के साथ संसाधनों का बयान अभी भी स्पष्ट समापन के रूप में गिना जाता है।) बेशक, प्रोग्रामर भूल सकता है, इसलिए कि जहां अंतिम रूप से खेलने में आता है, लेकिन एक जादुई परी के रूप में नहीं जो जादुई चीजों को अंत में सही कर देगा: यदि अंतिम रूप से पता चलता है कि close()
लागू नहीं किया गया था, यह करता है नहींइसे लागू करने का प्रयास, ठीक है क्योंकि वहाँ (गणितीय निश्चितता के साथ) n00b प्रोग्रामर की भीड़ होगी जो इस काम पर भरोसा करेंगे कि वे बहुत आलसी थे या बहुत अनुपस्थित थे। इसलिए, अनिवार्य निपटान के साथ, जब अंतिम रूप से पता चलता है कि close()
आह्वान नहीं किया गया था, तो यह एक उज्ज्वल लाल त्रुटि संदेश में प्रवेश करता है, प्रोग्रामर को अपने s-- er, उसके सामान को ठीक करने के लिए बड़े वसा वाले सभी बड़े अक्षरों के साथ बताता है।
एक अतिरिक्त लाभ के रूप में, अफवाह यह है कि "जेवीएम एक तुच्छ अंतिम रूप () विधि को अनदेखा करेगा (जैसे कि जो कुछ भी किए बिना वापस आ जाता है, जैसे कि ऑब्जेक्ट क्लास में परिभाषित किया गया है)", इसलिए अनिवार्य निपटान के साथ आप सभी अंतिम रूप से बच सकते हैं अपने पूरे सिस्टम में भूमि के ऊपर ( Alip का जवाब देखने के अपने कोडिंग से कैसे भयानक इस भूमि के ऊपर है पर जानकारी के लिए) finalize()
इस तरह विधि:
@Override
protected void finalize() throws Throwable
{
if( Global.DEBUG && !closed )
{
Log.Error( "FORGOT TO CLOSE THIS!" );
}
//super.finalize(); see alip's comment on why this should not be invoked.
}
इसके पीछे विचार यह है कि Global.DEBUG
एक static final
चर जिसका मूल्य संकलन समय पर जाना जाता है, इसलिए यदि यह है false
तो संकलक पूरे if
बयान के लिए किसी भी कोड का उत्सर्जन नहीं करेगा , जो इसे एक तुच्छ (खाली) अंतिम रूप देगा, जो बदले में इसका मतलब है कि आपकी कक्षा को ऐसा माना जाएगा जैसे कि उसका कोई अंतिम रूप नहीं है। (सी # में यह एक अच्छा #if DEBUG
ब्लॉक के साथ किया जाएगा , लेकिन हम क्या कर सकते हैं, यह जावा है, जहां हम मस्तिष्क में अतिरिक्त उपरि के साथ कोड में स्पष्ट सादगी का भुगतान करते हैं।)
अनिवार्य निपटान के बारे में अधिक, डॉट नेट में संसाधनों के निपटान के बारे में अतिरिक्त चर्चा के साथ, यहाँ: michael.gr: अनिवार्य निपटान बनाम "निपटान-निपटान" घृणा
finalize()
थोड़ा गड़बड़ है। यदि आप कभी भी इसे लागू करते हैं, तो सुनिश्चित करें कि यह एक ही ऑब्जेक्ट पर अन्य सभी तरीकों के संबंध में थ्रेड-सुरक्षित है।