किसी वर्ग की सभी वस्तुओं पर नज़र रखना


9

मैं ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए नया हूं, और मैं इस मुद्दे में भाग रहा हूं। (मैं जावा में प्रोग्रामिंग कर रहा हूं) मैं इस बारे में पूछने में थोड़ा हिचक रहा हूं, क्योंकि यह एक ऐसा बुनियादी मुद्दा लगता है, लेकिन मुझे इस पर कोई जानकारी नहीं मिल रही है, या इसके बारे में कोई सवाल नहीं है, और इनमें से कोई भी नहीं मैंने इस मुद्दे पर जो पाठ्य पुस्तकें पढ़ी हैं (बिल्कुल बुनियादी स्तर पर):

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

मुझे लगता है कि, जैसा कि ओओपी में इस तरह की एक बहुत ही बुनियादी आवश्यकता है, इस बारे में जाने के लिए काफी संस्थागत, और सरल तरीका होना चाहिए? क्या किसी कक्षा की सभी वस्तुओं की एक अलग सूची रखना सामान्य अभ्यास है?

मैंने स्टैटिक ऐरे या कलेक्शन के बारे में सोचा, जिसमें इसके कंस्ट्रक्टर के माध्यम से बनाई गई हर नई वस्तु को जोड़ा जाएगा। हालांकि यह उपवर्गों के साथ काम नहीं करेगा, क्योंकि कंस्ट्रक्टरों को विरासत में नहीं मिला है?

मुझे पता है कि इस सवाल का एक आसान जवाब नहीं हो सकता है; मुझे बस उम्मीद है कि कोई मुझे इस विषय पर थोड़ा सा बता सकता है। मुझे लगता है कि अगर मुझे यहाँ ज्ञान के एक केंद्रीय टुकड़े की कमी है।


5
ट्रैक किए गए और ट्रैकर की एक अधिक विशिष्ट उदाहरण मदद कर सकता है। इस समस्या को संदर्भ के आधार पर कई अलग-अलग तरीकों से नियंत्रित किया जाता है कि उनका उपयोग कैसे किया जाता है, और इसी तरह।
जस्टिन सी सी

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

1
"विभिन्न प्रयोजनों के लिए उनके माध्यम से iterate" ... जैसे ...? आम तौर पर, एक ऑब्जेक्ट में एक 'मालिक' होता है (औपचारिक शब्द नहीं, प्रोग्राम अर्थ के बारे में अधिक सिर्फ एक बयान), और यह किसी और के लिए ऑब्जेक्ट के साथ 'विभिन्न उद्देश्यों' के लिए नहीं है।
आकाशवाणी

जवाबों:


8

मुझे नहीं पता कि आपको कक्षा के सभी उदाहरणों की सूची रखने की आवश्यकता क्यों है।

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

लेकिन अगर आप वास्तव में उस मार्ग का अनुसरण करना चाहते हैं:

  1. फैक्टरी पैटर्न का उपयोग करें। एक फैक्ट्री क्लास जिसमें विधियाँ होती हैं जो क्लास को इंसर्ट करती हैं और वस्तुओं को लौटाती हैं। इस तरह आपके पास तात्कालिकता को नियंत्रित करने के लिए एक केंद्रीय बिंदु है।
  2. एक सूची या सूचियों को रखने के लिए सिंगलटन पैटर्न का उपयोग करें जो उदाहरण प्रस्तुत करते हैं।
  3. बनाने के बाद कारखाने को एक निश्चित प्रकार की प्रत्येक वस्तु को एक सूची में रखें।

वैसे: कंस्ट्रक्टर विरासत में मिले हैं।


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

@jwenting बेशक यह एक तरीका है। लेकिन यह वर्गों और कारखाने के बीच बदसूरत, अनावश्यक निर्भरता पैदा करेगा। कक्षाओं को उस कारखाने के बारे में कुछ नहीं जानना चाहिए जो उन्हें बनाता है।
ट्यूलेंस कोर्डोवा

इसलिए फैक्ट्री इसे रखने के लिए फैक्ट्री को रजिस्टर करने के लिए कहने के बजाए इस पर
नज़र रखती है

एक सिंगलटन तकनीकी रूप से मेरे अनुमान के सभी उदाहरणों को धारण करेगा। एक एकल उदाहरण।
ऋग्वेद

3

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

मैंने स्टैटिक ऐरे या कलेक्शन के बारे में सोचा, जिसमें इसके कंस्ट्रक्टर के माध्यम से बनाई गई हर नई वस्तु को जोड़ा जाएगा। हालांकि यह उपवर्गों के साथ काम नहीं करेगा, क्योंकि कंस्ट्रक्टरों को विरासत में नहीं मिला है?

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


2

गेम बनाते समय लोग कभी-कभी प्रत्येक प्रकार के गेम ऑब्जेक्ट का "सेल्फ मैनेजिंग" संग्रह चाहते हैं।

एक कार्यान्वयन इस तरह दिखता है:

public class Car {

    static ArrayList<Car> list = new ArrayList<Car>();

    public Car() {
        list.add(this);
    }

    void kill() {
        list.remove(this);
    }

    static public void updateAll()
    {
        for (int i = list.size() - 1; i >= 0; i--)
        {
                list.get(i).update();
        }
    }

    public void update()
    {
        //update logic
    }
}

इस तरीके से संग्रह में हेरफेर करने वाले तरीकों को स्थिर घोषित किया जा सकता है जबकि गैर-स्थिर तरीकों से एक उदाहरण (अपडेट बनाम अपडेट) में हेरफेर किया जा सकता है।

जबकि बहुत ही सरल परिदृश्यों के लिए ठीक है, यहां तक ​​कि मध्यम जटिलता के साथ यह आमतौर पर अलग प्रबंधक कक्षाएं बनाने के लिए सबसे अच्छा है।


1
आप सीधे static ArrayList<ListeStatic> list = new ArrayList<ListeStatic>();ans supress the statc {..}
cl-r

2
जावा विधि में नाम लोअरकेस अक्षर से शुरू होता है:uptdateAll(){..;}
cl-r

उफ़ ... जब से मैंने सार्वजनिक रूप से अपने जावा को प्रसारित किया है, तब से थोड़ी देर हो गई है
केली थॉमस

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

1
@ केटानो गोंकोलव्स एक स्थिर क्षेत्र के रूप में यह सभी उदाहरणों द्वारा साझा की गई एक सूची है।
केली थॉमस

2

संदर्भ सोचने की कोशिश करें। जब आप एक ऑब्जेक्ट बनाते हैं, तो आप एक निश्चित संदर्भ में ऐसा करते हैं। उदाहरण के लिए, यदि आपका खेल एलियंस की शूटिंग के बारे में है, तो आपका ऐप हर समय नई विदेशी वस्तुओं का निर्माण करेगा। उन्हें स्पेस नामक क्षेत्र में प्रदर्शित किया जाएगा (जो मुख्य UI का प्रतिनिधित्व करने वाला वर्ग हो सकता है)।

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

यदि आप अपने ऐप के अन्य हिस्सों के भीतर से एलियंस के इस संग्रह तक पहुँच प्राप्त करना चाहते थे (जैसे, एक सेटिंग पृष्ठ से, जहाँ आप उपयोगकर्ताओं को एक प्रकार के झटके में कुछ प्रकार के एलियन को मिटा सकते हैं), तो आपकी सेटिंग्स का संदर्भ होगा स्पेस ऑब्जेक्ट को एक्सेस देने की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.