जावा में वर्ग के सदस्यों को नहीं बदल सकने वाली पद्धति की घोषणा कैसे करें? [डुप्लीकेट]

Nov 30 2020

C ++ में हम एक निरंतर विधि करते हैं, और इसलिए यह कक्षा के सदस्यों के मूल्य को नहीं बदल सकता है, लेकिन मैं इसे जावा में कैसे कर सकता हूं? मैंने अंतिम विधि घोषणा की कोशिश की, जो C ++ में const के बराबर होगी, लेकिन अंतिम विधियां एक और अलग बात हैं। मैं एक गटर विधि बनाना चाहता हूं, इसलिए यह मूल्यों को नहीं बदल सकता है, केवल इसे पढ़ें। केवल-पढ़ने की विधि की तरह।

जवाब

10 AlexShesterov Nov 30 2020 at 17:16

जावा में, गैर-अंतिम क्षेत्रों को बदलने से किसी विधि को घोषित रूप से रोकना संभव नहीं है । जावा में "कांस्ट शुद्धता" जैसी कोई चीज नहीं है।

यदि एक वर्ग क्षेत्र गैर है- final, तो इसे कक्षा के किसी भी तरीके से बदला जा सकता है।

ध्यान दें कि finalअलग-अलग क्षेत्रों और चर बनाम तरीकों और कक्षाओं पर काम करता है:

  • एक finalक्षेत्र या चर एक स्थिर है। एक बार असाइन किए जाने पर इसका मान नहीं बदला जा सकता है।
  • एक finalविधि को बाल वर्गों द्वारा ओवरराइड नहीं किया जा सकता है। final"कब्ज" से तरीकों का कोई लेना-देना नहीं है।
  • एक finalवर्ग बढ़ाया नहीं जा सकता। finalकक्षाओं में "कब्ज" से कोई लेना-देना नहीं है।

जावा में आपके विकल्प हैं:

  1. अपनी कक्षा को अपरिवर्तनीय बनाएं (यानी उसके सभी क्षेत्रों को चिह्नित करें final)।
  2. बस अपने गेटर्स (और अन्य गैर-उत्परिवर्ती तरीकों) को सावधानी से लिखें :)

एक और नोट। यहां तक ​​कि खेतों और चर पर, जावा का finalसी ++ से अलग है const। उदाहरण के लिए:

  • finalएक बार असाइन किए जाने के बाद चर नहीं बदले जा सकते, लेकिन घोषणा के बाद आप उन्हें असाइन कर सकते हैं । उदाहरण:

      final int value;
      if (condition) {
          value = 1; // Ok!
      } else {
          value = 2; // Ok!
      }
      value = 3; // Compile error: value already assigned.
    
  • finalवर्ग फ़ील्ड को असाइन किया जाना चाहिए - या तो सीधे या एक निर्माता के भीतर से। लेकिन इन क्षेत्रों को एक निर्माणकर्ता के भीतर कहीं भी सौंपा जा सकता है । Java में C ++ की "initializer सूची" जैसी कोई विशेष बात नहीं है।

  • final Object objजावा में फ़ील्ड / वैरिएबल / पैरामीटर घोषणा सी + + में एक नॉन-कॉस्ट ऑब्जेक्ट के लिए (कॉन्स्ट-रे) के लगभग बराबर है । इसका अर्थ है, आप संदर्भ को पुनः असाइन नहीं कर सकते , लेकिन आप संदर्भित ऑब्जेक्ट को स्वयं बदल सकते हैं। एक उदाहरण:

      // Note that (obsolete) Date class is mutable in Java.
      final Date myDate = new Date();
    
      myDate = new Date(); // Compilation error: can't reassign a final reference!
    
      myDate.setTime(4711); // Ok, mutating referenced object is allowed!
    
salapura.stefan Nov 30 2020 at 17:17

तुम यह नहीं कर सकते। अंतिम विधि का मतलब है कि इसे खत्म नहीं किया जा सकता है।