मान लें कि मेरे पास एक संदर्भ प्रकार चर वाला वर्ग है। मैं उस वस्तु के संग्रहीत मूल्यों को नहीं चाहता जो यह परिवर्तनीय स्टोर बदलने में सक्षम हो, लेकिन मैं ऑब्जेक्ट को स्वयं प्राप्त करने/इसके मूल्यों तक पहुंचने में सक्षम होना चाहता हूं। यह इसे निजी बनाने और एक गेट्टर बनाने के लिए कहता है, लेकिन कोई सेटर नहीं। हालांकि ऐसा करना केवल उस वस्तु को बदलने की मेरी क्षमता को सीमित करता है जिसे चर इंगित करता है, लेकिन यह मुझे वस्तु के मूल्यों को बदलने से नहीं रोकता है।

private void program(){

    Test test = new Test(3);

    out.println(test.getA().a); // initial value, prints 3

    test.getA().a = 4; // changes referenced value through getter, even though the object is private, and has no setter

    out.println(test.getA().a); // changed value, prints 4

}

class Test{
    private A a;

    public Test(int a){
        this.a = new A(a);
    }

    public A getA(){
        return a;
    }
}

class A{
    public int a;

    public A(int a){
        this.a = a;
    }
}

ऊपर दिए गए कोड में मैं ऑब्जेक्ट के मूल्यों तक पहुंचने के लिए गेटर का उपयोग कर सकता हूं, भले ही मैंने इसे होने से रोकने के लिए वैरिएबल को निजी बना दिया हो। एकमात्र तरीका जो मैं इसके चारों ओर देखता हूं वह एक नया ए ऑब्जेक्ट बनाना है जिसे मैं हर बार गेटटर विधि कहता हूं, लेकिन मेरे लिए यह अक्षम लगता है क्योंकि यह स्मृति में अनावश्यक स्थान लेता है।

क्या परिवर्तन को रोकने के दौरान वस्तु को पढ़ने का कोई बेहतर तरीका है या क्या मुझे कुछ याद आ रहा है?

अग्रिम में धन्यवाद।

-1
linus3 22 नवम्बर 2020, 21:51

2 जवाब

सबसे बढ़िया उत्तर

यह एक आम समस्या है और इसके 2 मुख्य समाधान हैं:

  1. जिस तरह से आपने गेट्टर में कॉपी-कंस्ट्रक्टर या क्लोन () विधि के साथ वर्णन किया है
  2. आप अपनी ए क्लास को अपरिवर्तनीय बना सकते हैं - बस सभी फ़ील्ड को अंतिम बनाएं और इसे एक बार कन्स्ट्रक्टर या नेस्टेड बिल्डर के माध्यम से प्रारंभ करें

इसके अलावा, मैं सलाह देता हूं कि मूल्य-प्रकार के क्षेत्रों को बिल्कुल भी सार्वजनिक न करें

उपयोगी लिंक्स:

0
Qwer Izuken 22 नवम्बर 2020, 22:10
आपके दूसरे समाधान के लिए, 'ए' विशेषता को बदला जा सकता है, मैं नहीं चाहता कि इसे टेस्ट क्लास के बाहर बदला जाए। और मैंने इसे केवल इस उदाहरण के लिए सार्वजनिक रूप से सेट किया है, मुझे एहसास है कि मुझे वास्तविक कोड में मूल्य-प्रकार फ़ील्ड को सार्वजनिक रूप से सेट नहीं करना चाहिए। आपके पहले समाधान के लिए, मेरा पहला प्रश्न अभी भी खड़ा है: क्या वस्तु का क्लोनिंग सिर्फ अनावश्यक स्थान नहीं लेगा? या यह समस्या का एकमात्र तरीका है?
 – 
linus3
22 नवम्बर 2020, 23:06
नहीं, आप केवल एक विशेष वर्ग से संदर्भ द्वारा अपनी परिवर्तनीय वस्तु को संपादन योग्य नहीं बना सकते हैं। और, ज़ाहिर है, क्लोनिंग कुछ अतिरिक्त प्रोसेसर और मेमोरी संसाधनों का उपयोग करता है। लेकिन अगर आप टेस्ट क्लास में ए ऑब्जेक्ट को संशोधित करना चाहते हैं, तो आप इसे अपरिवर्तनीय क्यों नहीं बना सकते हैं और इसकी आवश्यकता होने पर बदले गए फ़ील्ड के साथ एक नया उदाहरण क्यों बना सकते हैं? यह प्रदर्शन के मुद्दे को हल करेगा। गेट्टर को f.e, सेटर की तुलना में अधिक बार निष्पादित किया जाना चाहिए।
 – 
Qwer Izuken
22 नवम्बर 2020, 23:50

मुझे नहीं पता कि मैं आपकी समस्या को ठीक कर रहा हूं ... लेकिन आप कक्षा ए में वेरिएबल को निजी क्यों नहीं बनाते और इसके लिए सिर्फ गेटर बनाते हैं?

कुछ इस तरह:

class A{
    private int a;

    public A(int a){
        this.a = a;
    }

    public int getA() {
        return this.a;
    }

}

अगर मुझे आपकी समस्या ठीक लगे तो मुझे बताएं :)

सादर

सेबास्टियन

0
Sebastian Brunnert 22 नवम्बर 2020, 22:08