दिलचस्प पोस्ट
गतिशील रूप से प्रतिपादन एएसपी: ASP.NET में ब्लॉब प्रविष्टि की छवि उदाहरण के बारे में "व्यवहार में जावा संगतता" के बारे में सवाल पाइपों के उपयोग से दो कार्यक्रमों के बीच एक साधारण स्ट्रिंग कैसे भेजनी है? दशमलव अंकों के साथ संख्यात्मक मान दर्ज करने का सबसे अच्छा तरीका क्या है? यूआईटीबार का टिंट / पृष्ठभूमि रंग बदलने पोर्टरडाफ.मॉड का एंड्रॉइड ग्राफिक्स में क्या मतलब है। यह क्या करता है? जावा और .NET स्ट्रिंग literals कहाँ रहते हैं? C ++ पॉइंटर के लिए डिफ़ॉल्ट कन्स्ट्रक्टर क्या है? पिक्सेल में सटीक आकार वाला एक चित्र निर्दिष्ट करना और सहेजना सीएटी में पोस्ट इंचार्जमेंट का व्यवहार जावा डेस्कटॉप अनुप्रयोग: SWT बनाम स्विंग प्रोग्रामेटिक रूप से संबंधित लेआउट में एक दूसरे के नीचे देखें बहु-लाइन खोज के लिए रेगेक्स (जीआरपी) की आवश्यकता Asp.Net MVC: क्यों मेरे दृश्य मेरे नियंत्रक को नल मॉडल वापस उत्तीर्ण है? कक्षा android.support.v7.widget.Toolbar बढ़ती त्रुटि?

जावा में अंतिम कक्षा का उपयोग

मैं जावा के बारे में एक किताब पढ़ रहा हूं और यह कहता है कि आप पूरे वर्ग को final रूप में घोषित कर सकते हैं। मैं कुछ नहीं सोच सकता जहां से मैं इसका उपयोग करूँ।

मैं सिर्फ प्रोग्रामिंग के लिए नया हूँ और मैं सोच रहा हूं कि यदि प्रोग्रामर वास्तव में अपने कार्यक्रमों पर इसका इस्तेमाल करते हैं । यदि वे करते हैं, तो वे इसका उपयोग कब करते हैं, तो मैं इसे बेहतर समझ सकता हूँ और यह जान सकता हूँ कि इसका उपयोग कब किया जाए

यदि जावा वस्तु उन्मुख है, और आप एक वर्ग के final घोषित करते हैं, तो क्या यह वस्तुओं के गुणों वाले वर्ग के विचार को रोक नहीं सकता है?

वेब के समाधान से एकत्रित समाधान "जावा में अंतिम कक्षा का उपयोग"

यदि वे करते हैं, तो वे इसका उपयोग कब करते हैं, तो मैं इसे बेहतर समझ सकता हूँ और यह जान सकता हूँ कि इसका उपयोग कब किया जाए

एक final वर्ग बस एक ऐसा वर्ग है जिसे विस्तारित नहीं किया जा सकता है

(इसका मतलब यह नहीं है कि कक्षा के ऑब्जेक्ट के सभी संदर्भ कार्य करेगा जैसा कि उन्हें final रूप घोषित किया गया था।)

जब यह एक वर्ग घोषित करने के लिए उपयोगी होता है जिसे अंतिम रूप से इस प्रश्न के उत्तर में शामिल किया गया है:

  • जावा में विरासत को निषेध करने के लिए अच्छे कारण हैं?

यदि जावा वस्तु उन्मुख है, और आप एक वर्ग के final घोषित करते हैं, तो क्या यह वस्तुओं के गुणों वाले वर्ग के विचार को रोक नहीं सकता है?

कुछ अर्थों में हाँ

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


संबंधित लेख: जावा: कब एक अंतिम कक्षा बनाने के लिए

जावा में, final संशोधक के साथ आइटम नहीं बदला जा सकता है!

इसमें अंतिम कक्षाएं, अंतिम चर और अंतिम तरीकों शामिल हैं:

  • किसी अन्य वर्ग द्वारा एक अंतिम वर्ग को बढ़ाया नहीं जा सकता
  • एक अंतिम चर को दूसरे मान पर फिर से निर्दिष्ट नहीं किया जा सकता है
  • एक अंतिम विधि ओवरराइड नहीं किया जा सकता

एक परिदृश्य जहां अंतिम महत्वपूर्ण है, जब आप सुरक्षा कारणों से एक वर्ग की विरासत को रोकना चाहते हैं यह आपको यह सुनिश्चित करने की अनुमति देता है कि आप चला रहे कोड किसी के द्वारा ओवरराइड नहीं किया जा सकता है

एक और परिदृश्य ऑप्टिमाइज़ेशन के लिए है: मुझे याद आ रहा है कि जावा कंपाइलर अंतिम कक्षाओं से कुछ फ़ंक्शन कॉल की रूपरेखा है। इसलिए, यदि आप ax() और एक घोषित final , तो हम संकलन समय पर जानते हैं कि कोड क्या होगा और कॉलिंग फ़ंक्शन में इनलाइन कर सकता है। मुझे नहीं पता कि यह वास्तव में किया गया है, लेकिन अंतिम के साथ यह एक संभावना है।

सबसे अच्छा उदाहरण है

सार्वजनिक अंतिम श्रेणी स्ट्रिंग

जो एक अपरिवर्तनीय वर्ग है और विस्तारित नहीं किया जा सकता है। बेशक, सिर्फ क्लास फाइनल को अपरिवर्तनीय बनाने से ज्यादा कुछ नहीं है।

यदि आप वर्ग के पदानुक्रम को एक पेड़ के रूप में देखते हैं (जैसा कि यह जावा में है), अमूर्त वर्ग केवल शाखाएं हो सकते हैं और अंतिम कक्षाएं उन हैं जो केवल पत्ती हो सकती हैं जिन वर्गों में न तो उन श्रेणियों में शामिल हो, वे दोनों शाखाएं और पत्ते हो सकते हैं।

यहां ओ ओ सिद्धांतों का कोई उल्लंघन नहीं है, अंतिम केवल एक अच्छा समरूपता प्रदान कर रहा है

अभ्यास में आप अंतिम उपयोग करना चाहते हैं यदि आप चाहते हैं कि आपकी ऑब्जेक्ट अपरिवर्तनीय हों या यदि आप एपीआई लिख रहे हों, तो एपीआई के उपयोगकर्ताओं को सिग्नल कर दें कि क्लास केवल विस्तार के लिए नहीं किया गया है।

प्रासंगिक पठन: बॉब मार्टिन द्वारा ओपन-क्लोज़ेड प्रिंसिपल

कुंजी उद्धरण:

एक्सटेंशन के लिए सॉफ्टवेयर इकाइयां (कक्षाएं, मॉड्यूल, फ़ंक्शंस, आदि) खुली होंगी, लेकिन संशोधन के लिए बंद कर दिया गया है।

final कीवर्ड इसका मतलब जावा में लागू करने के लिए है, चाहे वह तरीकों पर या कक्षाओं में इस्तेमाल किया जाए

यदि वर्ग को final रूप से चिह्नित किया गया है, तो इसका मतलब है कि क्लास की संरचना बाहरी किसी भी चीज़ से संशोधित नहीं की जा सकती है जहां यह सबसे अधिक दिखाई दे रहा है, जब आप परंपरागत बहुपक्षीय विरासत कर रहे हैं, मूल रूप से class B extends A बस काम नहीं करेगा यह मूल रूप से आपके कोड के कुछ हिस्सों (हद तक) की रक्षा करने का एक तरीका है

स्पष्ट करने के लिए, क्लास final को चिह्नित करने से अपने खेतों को final रूप में चिह्नित नहीं किया जाता है और ऐसा ऑब्जेक्ट गुणों की रक्षा नहीं करता है बल्कि वास्तविक वर्ग संरचना की बजाय।

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

अंतिम श्रेणी की समस्या का पता करने के लिए:

कक्षा अंतिम बनाने के दो तरीके हैं प्रथम श्रेणी घोषणा में कीवर्ड फ़ाइनल का उपयोग करना है:

 public final class SomeClass { // . . . Class contents } 

कक्षा अंतिम बनाने का दूसरा तरीका अपने सभी कन्स्ट्रक्टरों को निजी के रूप में घोषित करना है:

 public class SomeClass { public final static SOME_INSTANCE = new SomeClass(5); private SomeClass(final int value) { } 

इसे अंतिम रूप से चिह्नित करना आपको परेशानी बचाता है यदि यह पता लगाना है कि यह वास्तविक है, तो इस टेस्ट क्लास को देखने के लिए दिखाएं। पहली नज़र में जनता को दिखता है

 public class Test{ private Test(Class beanClass, Class stopClass, int flags) throws Exception{ // . . . snip . . . } } 

दुर्भाग्य से, क्योंकि कक्षा का एकमात्र कंसट्रक्टर निजी है, इस वर्ग का विस्तार करना असंभव है। टेस्ट क्लास के मामले में, क्लास अंतिम होना चाहिए कोई कारण नहीं है। टेस्ट क्लास का एक अच्छा उदाहरण है कि कैसे अंतर्निहित अंतिम कक्षाएं समस्याएं पैदा कर सकती हैं।

तो आपको इसे अंतिम रूप से चिह्नित करना चाहिए जब आप निस्संदेह इसे कन्स्ट्रक्टर निजी बनाकर अंतिम श्रेणी बनाते हैं।

कीवर्ड final मतलब है कि कुछ अंतिम है और इसे किसी भी तरह से संशोधित नहीं किया जाना चाहिए। अगर कोई क्लास final रूप से चिह्नित है तो इसे बढ़ाया नहीं जा सकता है या उप-वर्गीकृत नहीं किया जा सकता है। लेकिन सवाल यह है कि हम एक क्लास final को क्यों चिह्नित करते हैं? आईएमओ में कई कारण हैं:

  1. मानकीकरण: कुछ वर्ग मानक कार्य करते हैं और वे संशोधित होने के लिए नहीं होते हैं, उदाहरण के लिए स्ट्रिंग मैनीप्युलियल्स या गणितीय फ़ंक्शंस आदि से संबंधित विभिन्न कार्यों का आयोजन करना।
  2. सुरक्षा कारण : कभी-कभी हम ऐसी कक्षाएं लिखते हैं जो विभिन्न प्रमाणीकरण और पासवर्ड संबंधी कार्य करते हैं और हम नहीं चाहते कि उन्हें किसी और के द्वारा बदल दिया जाए।

मैंने सुना है कि मार्किंग क्लास final दक्षता में सुधार हुआ है, लेकिन स्पष्ट रूप से मुझे इस तर्क को बहुत वजन रखने में नहीं मिल सका।

यदि जावा वस्तु उन्मुख है, और आप एक वर्ग के अंतिम घोषित करते हैं, तो क्या यह वस्तुओं के गुणों वाले वर्ग के विचार को रोक नहीं सकता है?

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

एक ओर ध्यान में रखते हुए हमें विरासत पर संरचना पसंद करना चाहिए और final कुंजीशब्द वास्तव में इस सिद्धांत को लागू करने में मदद करता है।

हां, कभी-कभी आप यह चाहते हैं कि या तो सुरक्षा या गति कारणों के लिए। यह सी ++ में भी किया जाता है यह प्रोग्राम के लिए लागू नहीं हो सकता है , लेकिन चौखटे के लिए मोरेरो। http://www.glenmccl.com/perfj_025.htm

एक अंतिम वर्ग एक ऐसा वर्ग है जिसे विस्तारित नहीं किया जा सकता है। यह भी बताए गए कि उपवर्गों द्वारा ओवरराइड नहीं किया जा सकता है, इसके लिए भी फास्ट के रूप में विधियां घोषित की जा सकती हैं।

उप-क्लास होने से क्लास को रोकना विशेष रूप से उपयोगी हो सकता है यदि आप एपीआई या लाइब्रेरी लिखते हैं और आधार व्यवहार बदलने के लिए विस्तारित होने से बचने के लिए चाहते हैं।

अंतिम रूप में एक वर्ग रखने का एक फायदा: –

स्ट्रिंग वर्ग को अंतिम रूप दिया जाता है ताकि कोई भी अपने तरीकों को ओवरराइड कर सके और कार्यक्षमता बदल सके। जैसे कोई भी लंबाई () विधि की कार्यक्षमता बदल सकता है यह हमेशा एक स्ट्रिंग की लंबाई वापस करेगा।

इस वर्ग के डेवलपर को इस वर्ग की कार्यक्षमता बदलने में कोई भी नहीं चाहता, इसलिए उसने इसे अंतिम रूप में रखा।

जब आप नए तरीकों को जोड़ते हैं, तो final class सार्वजनिक एपीआई को तोड़ने से बच सकती हैं

मान लीजिए कि आपके Base वर्ग के संस्करण 1 पर आप ऐसा करते हैं:

 public class Base {} 

और एक ग्राहक करता है:

 class Derived extends Base { public int method() { return 1; } } 

तब अगर संस्करण 2 में आप Base method विधि जोड़ना चाहते हैं:

 class Base { public String method() { return null; } } 

यह क्लाइंट कोड को तोड़ देगा।

अगर हमने इसके बजाय final class Base का इस्तेमाल किया है, तो ग्राहक को वारिस नहीं होने दिया जाएगा, और विधि अतिरिक्त एपीआई को तोड़ नहीं पाएगा।

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

क्लास घोषित होने से एक क्लास को तत्काल होने से नहीं रोका जाता है, इसका मतलब यह नहीं है कि यह क्लास को किसी ऑब्जेक्ट की विशेषताओं के होने से रोक देगा। यह सिर्फ यही है कि आपको उन तरीकों से चिपकना पड़ेगा जैसे वे कक्षा में घोषित किए जाते हैं।

"पंक्ति के अंत" के रूप में अंतिम के बारे में सोचें – वह लड़का अब वंश पैदा नहीं कर सकता। तो जब आप इसे इस तरह देख रहे हैं, तो वास्तविक दुनिया के परिदृश्यों के बहुत सारे हैं कि आप उस पार आएंगे जिसके लिए आपको क्लास के लिए 'लाइन ऑफ मार्क' मार्कर को ध्वजांकित करने की आवश्यकता है। यह डोमेन प्रेरित डिजाइन है- यदि आपका डोमेन मांग करता है कि दी गई ENTITY (कक्षा) उप-कक्षाएं नहीं बना सकती, तो इसे अंतिम रूप के रूप में चिह्नित करें

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

सबसे अच्छा तरीका है डोमेन को देखने और इसे अपने डिजाइन निर्णयों को निर्देशित करने के लिए।

जैसा कि ऊपर बताया गया है, यदि आप चाहते हैं कि कोई भी विधि की कार्यक्षमता बदल सके तो आप इसे अंतिम रूप में घोषित कर सकते हैं।

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

एंड्रॉइड लूपर क्लास इस का एक अच्छा व्यावहारिक उदाहरण है। http://developer.android.com/reference/android/os/Looper.html

लूपर क्लास कुछ कार्यक्षमता प्रदान करता है जो अन्य वर्गों द्वारा ओवरराइड होने का इरादा नहीं है। इसलिए, यहां कोई उप-वर्ग नहीं है

यदि आप किसी भी वर्ग को अंतिम रूप में बनाते हैं, तो आप इसे विस्तार नहीं कर सकते।

 final class Bike{} class Honda1 extends Bike{ void run(){System.out.println("running safely with 100kmph");} public static void main(String args[]){ Honda1 honda= new Honda(); honda.run(); } } Output:Compile Time Error 

ऑब्जेक्ट ओरिएंटेशन विरासत के बारे में नहीं है, यह इनकैप्सुलेशन के बारे में है। और विरासत टूटना

एक वर्ग के अंतिम घोषित करने से बहुत सारे मामलों में सही समझ होती है। कोई भी वस्तु "रंग" या रंग की तरह "मान" का प्रतिनिधित्व करता है, वह अंतिम हो सकता है वे अपने दम पर खड़े हैं

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

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