जावा: संदर्भ द्वारा इंट पास करने का सबसे अच्छा तरीका


84

मेरे पास एक पार्सिंग फ़ंक्शन है जो बाइट बफर से एक एन्कोडेड लंबाई को पार्स करता है, यह पार्स की गई लंबाई को इंट के रूप में लौटाता है, और एक इंडेक्स को एक पूर्णांक आर्ग के रूप में बफर में ले जाता है। मैं चाहता हूं कि फ़ंक्शन इंडेक्स को उसी के अनुसार अपडेट करे, जो संदर्भ द्वारा उस इंडेक्स को पास करना चाहता है। सी में मैं सिर्फ एक पास करूँगा int *। जावा में ऐसा करने का सबसे साफ तरीका क्या है? मैं वर्तमान में सूचकांक arg को देख रहा हूँ। एक के रूप में int[], लेकिन यह थोड़ा बदसूरत है।


13
Integerअपरिवर्तनीय है।
युवल एडम

1
यदि आप अपाचे लाइब्रेरी से बचना चाहते हैं, तो आप इंट पास कर सकते हैं और अपडेटेड वैल्यू वापस कर सकते हैं। यदि यह दो मान है, तो मैं प्वाइंट को कंटेनर के रूप में उपयोग करने की सलाह देता हूं। अन्यथा, सरणी विकल्प या अन्य सुझावों में से एक यहाँ ठीक है।
EntangledLoops

आपको एक इंट या ऑब्जेक्ट वापस करना चाहिए; यदि आपको वास्तव में एक से अधिक की आवश्यकता है, तो शायद आपको अपने 'वर्गों' के डिजाइन पर फिर से विचार करना चाहिए
उज्जवल सिंह

जवाबों:


72

आप org.apache.commons.lang.mutable.MutableIntApache Commons लाइब्रेरी से उपयोग करके देख सकते हैं । भाषा में इसे करने का कोई सीधा तरीका नहीं है।


24

जावा में यह संभव नहीं है। जैसा कि आपने सुझाव दिया है कि एक रास्ता एक है int[]। एक और एक छोटा वर्ग होगा जैसे IntHolderकि एक लिपटे int


20

आप जावा में संदर्भ द्वारा तर्क पारित नहीं कर सकते।

आप जो कर सकते हैं वह अपने पूर्णांक मूल्य को एक परिवर्तनशील वस्तु में लपेटने के लिए है। Apache Commons ' MutableIntका उपयोग करना एक अच्छा विकल्प है। एक और, थोड़ा और अधिक अस्पष्ट तरीके से, जैसा int[]कि आपने सुझाया है, वैसे ही उपयोग करना है । मैं इसका उपयोग नहीं करूंगा क्योंकि यह स्पष्ट नहीं है कि आप intएकल-कक्ष सरणी में क्यों लपेट रहे हैं ।

ध्यान दें कि java.lang.Integerअपरिवर्तनीय है।


एटॉमिकइंटर के उपयोग के बारे में क्या? क्या यह परिवर्तनशील है और संदर्भ से होकर गुजरा है? (अफाक एटॉमिक रिफरेंस <बुलियन> यह सही ढंग से करता है)।
14:05 बजे icbytes


14

एक में बाइट बफर और सूचकांक लपेटें ByteBuffer वस्तु। एक बाइटबफ़र एक बफर + स्थिति की अवधारणा को एनकोड करता है और आपको अनुक्रमित स्थिति से पढ़ने और लिखने की अनुमति देता है, जो आपके साथ जाते ही अपडेट करता है।


6
बिल्कुल सही। जावा को अपने तरीके से करने के लिए मजबूर न करें, इसे जावा तरीके से करें। Java C. नहीं है। C इसे बनाने का प्रयास करता है जैसे C हमेशा बदसूरत हैक्स होगा।
हेड

9

आप इस तरह से नई कक्षा डिजाइन कर सकते हैं:

public class Inte{
       public int x=0;
}

बाद में आप इस वर्ग का उद्देश्य बना सकते हैं:

Inte inte=new Inte();

तब आप inteतर्क के रूप में पास कर सकते हैं जहाँ आप पूर्णांक चर को पास करना चाहते हैं:

public void function(Inte inte) {
some code
}

तो पूर्णांक मान अद्यतन करने के लिए:

inte.x=value;

मूल्य प्राप्त करने के लिए:

Variable=inte.x;

8

प्राथमिकताओं को लपेटने के लिए आप एक संदर्भ वर्ग बना सकते हैं:

public class Ref<T>
{
    public T Value;

    public Ref(T value)
    {
        Value = value;
    }
}

फिर आप एक पैरामीटर के रूप में संदर्भ लेने वाले फ़ंक्शन बना सकते हैं:

public class Utils
{
    public static <T> void Swap(Ref<T> t1, Ref<T> t2)
    {
        T temp = t1.Value;
        t1.Value = t2.Value;
        t2.Value = temp;
    }
}

उपयोग:

Ref<Integer> x = 2;
Ref<Integer> y = 9;
Utils.Swap(x, y);

System.out.println("x is now equal to " + x.Value + " and y is now equal to " + y.Value";
// Will print: x is now equal to 9 and y is now equal to 2

उम्मीद है की यह मदद करेगा।

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