खोज…


परिचय

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

टिप्पणियों

जावा में कुछ अपरिवर्तनीय कक्षाएं:

  1. java.lang.String
  2. आदिम प्रकारों के लिए आवरण वर्ग: java.lang.Integer, java.lang.Byte, java.lang.Character, java.lang.Short, java.lang.Bangean, java.lang.Long, java.lang.Double, java.lang.Float
  3. अधिकांश एनुम वर्ग अपरिवर्तनीय हैं, लेकिन यह वास्तव में ठोस मामले पर निर्भर करता है।
  4. java.math.BigInteger और java.math.BigDecimal (उन कक्षाओं की कम से कम वस्तुएं)
  5. java.io.File। ध्यान दें कि यह VM (स्थानीय सिस्टम पर एक फ़ाइल) के लिए एक बाहरी वस्तु का प्रतिनिधित्व करता है, जो मौजूद हो सकता है या नहीं भी हो सकता है, और इस बाहरी वस्तु की स्थिति को संशोधित और क्वेरी करने के कुछ तरीके हैं। लेकिन फ़ाइल ऑब्जेक्ट ही अपरिवर्तनीय रहता है।

अपरिवर्तनीय वर्गों को परिभाषित करने के लिए नियम

निम्नलिखित नियम अपरिवर्तनीय वस्तुओं को बनाने के लिए एक सरल रणनीति को परिभाषित करते हैं।

  1. "सेटर" विधियाँ प्रदान न करें - वे विधियाँ जो फ़ील्ड्स या ऑब्जेक्ट्स को फ़ील्ड्स द्वारा संदर्भित करती हैं।
  2. सभी क्षेत्रों को अंतिम और निजी बनाएं।
  3. उपवर्गों को विधियों को ओवरराइड करने की अनुमति न दें। ऐसा करने का सबसे सरल तरीका वर्ग को अंतिम घोषित करना है। एक अधिक परिष्कृत दृष्टिकोण निर्माता को निजी बनाने और कारखाने के तरीकों में उदाहरणों का निर्माण करना है।
  4. यदि उदाहरण फ़ील्ड में परिवर्तनशील वस्तुओं के संदर्भ शामिल हैं, तो उन वस्तुओं को बदलने की अनुमति न दें:
  5. ऐसी विधियाँ प्रदान न करें जो उत्परिवर्तित वस्तुओं को संशोधित करती हैं।
  6. उत्परिवर्तित वस्तुओं का संदर्भ साझा न करें। बाहरी, उत्परिवर्तित वस्तुओं को संदर्भों को कभी भी स्टोर न करें; यदि आवश्यक हो, तो प्रतियां बनाएँ, और प्रतियों के संदर्भों को संग्रहीत करें। इसी तरह, अपने तरीकों में मूल लौटने से बचने के लिए आवश्यक होने पर अपनी आंतरिक परिवर्तनशील वस्तुओं की प्रतियां बनाएं।

उदाहरण के बिना उत्परिवर्तित रेफ

public final class Color {
    final private int red;
    final private int green;
    final private int blue;

    private void check(int red, int green, int blue) {
        if (red < 0 || red > 255 || green < 0 || green > 255 || blue < 0 || blue > 255) {
            throw new IllegalArgumentException();
        }
    }

    public Color(int red, int green, int blue) {
        check(red, green, blue);
        this.red = red;
        this.green = green;
        this.blue = blue;
    }

    public Color invert() {
        return new Color(255 - red, 255 - green, 255 - blue);
    }
}

उत्परिवर्ती रेफ के साथ उदाहरण

इस मामले में क्लास पॉइंट परस्पर भिन्न होता है और कुछ उपयोगकर्ता इस क्लास की वस्तु की स्थिति को संशोधित कर सकते हैं।

class Point {
    private int x, y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }
    
    public void setX(int x) {
        this.x = x;
    }
    
    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

//...

public final class ImmutableCircle {
    private final Point center;
    private final double radius;

    public ImmutableCircle(Point center, double radius) {
        // we create new object here because it shouldn't be changed
        this.center = new Point(center.getX(), center.getY());
        this.radius = radius;
    }

अपरिवर्तनीयता का लाभ क्या है?

अपरिवर्तनीयता का लाभ संगामिति के साथ आता है। उत्परिवर्तनीय वस्तुओं में शुद्धता बनाए रखना मुश्किल है, क्योंकि कई धागे एक ही वस्तु की स्थिति को बदलने की कोशिश कर सकते हैं, जिससे कुछ धागे एक ही वस्तु की एक अलग स्थिति को देखते हैं, जो कि रीड्स के समय पर निर्भर करता है और उक्त को लिखता है। वस्तु।

एक अपरिवर्तनीय वस्तु होने से, कोई यह सुनिश्चित कर सकता है कि वस्तु को देखने वाले सभी धागे एक ही स्थिति को देख रहे होंगे, क्योंकि एक अपरिवर्तनीय वस्तु की स्थिति नहीं बदलेगी।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow