मैंने जावा में एक कक्षा लागू की है, जो आंतरिक रूप से सूची स्टोर करती है। मैं कक्षा को अपरिवर्तनीय होना चाहता हूं। हालांकि, मुझे आंतरिक डेटा पर संचालन करने की आवश्यकता है जो वर्ग के संदर्भ में समझ में नहीं आता है। इसलिए, मेरे पास एक और कक्षा है जो एल्गोरिदम के सेट को परिभाषित करती है।जावा में अपरिवर्तनीय ऑब्जेक्ट्स और डेटा एक्सेसिंग
Wrapper.java
import java.util.List;
import java.util.Iterator;
public class Wrapper implements Iterable<Double>
{
private final List<Double> list;
public Wrapper(List<Double> list)
{
this.list = list;
}
public Iterator<Double> iterator()
{
return getList().iterator();
}
public List<Double> data() { return getList(); }
}
Algorithm.java
import java.util.Iterator;
import java.util.Collection;
public class Algorithm
{
public static double sum(Collection<Double> collection)
{
double sum = 0.0;
Iterator<Double> iterator = collection.iterator();
// Throws NoSuchElementException if the Collection contains no elements
do
{
sum += iterator.next();
}
while(iterator.hasNext());
return sum;
}
}
अब, मेरे सवाल है, वहाँ एक विश्वसनीय को संशोधित करने से किसी को रोकने के लिए रास्ता है: यहाँ एक सरल उदाहरण है इस तथ्य के बावजूद मेरा आंतरिक डेटा अपरिवर्तनीय है? जबकि मैंने डेटा() केवल पढ़ने के उद्देश्यों के लिए विधि प्रदान की है, तो स्पष्ट() और हटाएं() जैसी विधियों के माध्यम से डेटा को संशोधित करने से रोकने के लिए कुछ भी नहीं है। अब, मुझे एहसास है कि मैं अपने डेटा तक विशेष रूप से इटरेटर के माध्यम से पहुंच प्रदान कर सकता हूं। हालांकि, मुझे बताया गया है कि संग्रह पास करना सामान्य है। दूसरा, अगर मेरे पास एक एल्गोरिदम था जिसके लिए डेटा पर एक से अधिक पास की आवश्यकता होती है, तो मुझे एकाधिक इटरेटर प्रदान करना होगा, जो एक फिसलन ढलान की तरह दिखता है।
ठीक है, उम्मीद है कि एक साधारण समाधान है जो मेरी चिंताओं को हल करेगा। मैं सिर्फ जावा में वापस आ रहा हूं, और सी ++ में कॉन्स से निपटने से पहले इन चीजों को कभी नहीं माना। अग्रिम में धन्यवाद!
ओह! एक और बात मैंने अभी सोचा है। मैं व्यावहारिक रूप से आंतरिक सूची की एक प्रति वापस नहीं कर सकता। सूची आमतौर पर सैकड़ों हजार तत्व शामिल होंगे।
बिल्कुल सही! मैंने यह नहीं देखा। धन्यवाद। –
आपको अभी भी रैपर ऑब्जेक्ट के तरीके की देखभाल करना है: चूंकि सूची निर्माता को पास की जाती है, इसलिए कोड में कहीं और संदर्भ हो सकते हैं। यदि आप चाहते हैं कि रैपर वास्तव में अपरिवर्तनीय हो, तो आपको सूची की सामग्री कॉपी करनी होगी। –