फाइनल और अन्य जावा कीवर्ड - 1

"हाय, अमीगो!"

"हाय, बिलाबो!"

"आज मैं आपको जावा में कई खोजशब्दों के बारे में बताने जा रहा हूँ। लेकिन मैं सबसे दिलचस्प के साथ शुरू करूँगा: खोजशब्द अंतिम। "

" वेरिएबल, मेथड या क्लास घोषित करते समय आप कीवर्ड फ़ाइनल का उपयोग कर सकते हैं।"

"और हमें फाइनल की आवश्यकता क्यों है?"

"यह बहुत सरल है। यदि हम एक चर को अंतिम के रूप में चिह्नित करते हैं, तो यह अपरिवर्तनीय हो जाता है:"

final int i = 5;
i++; //Compilation error: the value of i cannot be changed.

"अच्छा ऐसा है।"

"यदि हम किसी विधि को अंतिम के रूप में चिह्नित करते हैं, तो व्युत्पन्न कक्षाओं में विधि को ओवरराइड करना प्रतिबंधित है:"

class Cat
{
 public final String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat
{
 public String getName() //Compilation error: overriding the getName()
 {
  return "tiger";
 }
}

"ठीक है। लेकिन आपको किसी विधि को ओवरराइड करने पर रोक लगाने की आवश्यकता क्यों होगी?"

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

"और अंत में, तीसरा उपयोग।"

"यदि हम एक वर्ग को अंतिम कीवर्ड के साथ चिह्नित करते हैं, तो यह विरासत में नहीं मिल सकता है।"

public final class Cat
{
 public String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat //Compilation error: the Cat class cannot be
{
 public String getName()
 {
  return "tiger";
 }
}

"और हम एक वर्ग को विरासत में मिलने से क्यों रोकेंगे?"

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

"लेकिन अगर एक डेवलपर को पता चलता है कि उसकी कक्षा में छोटे बदलाव भी उम्मीद के मुताबिक काम करना बंद कर देंगे, तो विरासत को मना करना बेहतर होगा।"

"उदाहरण के लिए, स्ट्रिंग वर्ग को अंतिम घोषित किया गया है, जैसा कि सभी आदिम प्रकार हैं: पूर्णांक, बूलियन, डबल, कैरेक्टर ..."

"आह, मिल गया। स्ट्रिंग क्लास को एक अपरिवर्तनीय वर्ग के रूप में बनाया गया था और यदि वे अचानक परिवर्तनशील थे, तो बहुत सी चीजें काम करना बंद कर देंगी।"

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

"आप फ़ाइनल का और कहां उपयोग कर सकते हैं?"

"आप फ़ंक्शन पैरामीटर से पहले अंतिम और विधि में चर से पहले उपयोग कर सकते हैं। यहां एक उदाहरण दिया गया है:"

public void setName(final String name)
{
 final String displayName = "Mr."+ name;
  …
 this.name = displayName;
}

"और इसका क्या मतलब है?"

"ठीक है, दो हैं। सबसे पहले, हम एक चर को अंतिम घोषित करते हैं यदि हम अन्य डेवलपर्स को बताना चाहते हैं कि यह मान एक विशिष्ट स्थिरांक है, न कि केवल एक चर।"

उदाहरण के लिए, हम मूल्य के आधार पर बिक्री कर की गणना करना चाहते हैं:

public int getPriceNDS()
{
 final int NDS = 20;
 return this.price * NDS / 200;
}

"और दूसरा, स्थानीय या अनाम इनर क्लास लिखते समय हमें इस प्रकार के वेरिएबल की आवश्यकता होती है। मैं आपको जल्द ही इस प्रकार की कक्षाओं के बारे में बताऊंगा। लेकिन आज नहीं।"

"ठीक है, अभी तक कुछ भी जटिल नहीं हुआ है।"

"कृपया ध्यान दें कि केवल वेरिएबल अपरिवर्तनीय हो जाता है, न कि किसी वस्तु को संदर्भित कर सकता है। वस्तु को अभी भी बदला जा सकता है।"

"मैं वास्तव में बस उसके बारे में पूछने वाला था। और वस्तु को अपरिवर्तनीय बनाने का कोई तरीका नहीं है?"

"नहीं, जब तक आप एक अपरिवर्तनीय वर्ग नहीं लिखते।"

"कृपया ध्यान दें कि क्योंकि अंतिम चर का मान बदला नहीं जा सकता है, आपको इसका प्रारंभिक मान तुरंत निर्दिष्ट करना होगा।"

यह कोड संकलित होगा यह कोड संकलित नहीं होगा
class Home
{
 private final int width = 200;
 private final int height = 100;

 public Home()
 {
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
 }
}

"लेकिन, उस ने कहा, जावा आपको कन्स्ट्रक्टर तक कक्षा के अंतिम चर के प्रारंभ में देरी करने देता है।"

यह कोड संकलित होगा यह कोड संकलित नहीं होगा
class Home
{
 private final int width = 200;
 private final int height;

 public Home()
 {
  height = 100;
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
 }
}

"इसके अतिरिक्त, अलग-अलग कंस्ट्रक्टर अलग-अलग वैल्यू के साथ फाइनल वेरिएबल को इनिशियलाइज़ कर सकते हैं। यह काफी सुविधाजनक है:"

यह कोड संकलित होगा
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
  width = 200;
 }

 public Home(int width)
 {
  this.height = 300;
  this.width = width;
 }

 public Home(int width, int height)
 {
  this.height = height;
  this.width = width;
 }
}

"यह वास्तव में एक दिलचस्प विषय था, और बिल्कुल सब कुछ समझ में आता है। धन्यवाद, बिलाबो!"