2012-05-13 17 views
5

प्रस्तावना: मैं एक सूची या अन्य संग्रह का उपयोग कर एक परिणाम के वापस जाने के लिए के बारे में पता कर रहा हूँ लेकिन फिर मैं परिणाम बाहर तोड़ सूची के माध्यम से जाना है: देखने के 2 उदाहरणलौटने से अधिक मान

प्रस्तावना-2: मैं 'm


परे एक जवाब "इस जावा में समर्थित नहीं है ..." मैं एक जावा विधि कॉल एक से अधिक ऑब्जेक्ट वापस जाने के लिए एक सुविधाजनक तरीका के लिए देख रहा हूँ की तलाश में। PHP में तरह की

प्रकार:

list ($obj1, $obj2, ...) foobar(); 

मैं वास्तव में उदाहरण के लिए बहस में धारक वस्तुओं गुजर थक हो रही है:

class Holder { 
    int value; 
} 

Holder h1=new Holder(); 
Holder h2=new Holder(); 

और उसके बाद:

o.foobar(h1,h2); 

... अगर किसी ने इसे पाने के लिए एक शानदार तरीका लगाया है तो बहुत दिलचस्पी होगी।


एक सूची का उपयोग करना

List<String> = foobar(); 

इस के लिए दो कमियां हैं:

मैं पहली बार घर से कॉल प्राप्त करने वाला पक्ष पर सूची पैक करने के लिए है:

// this is on the callee side of the house 
ArrayList<String> result = new ArrayList<String> 
result.add("foo"); 
result.add("bar"); 

फिर कॉलर पक्ष पर मुझे परिणामों को बाहर निकालना होगा:

// This is on the caller side 
List<String> result = foobar(); 
String result1 = result.get(0); 
String result2 = result.get(1); // this is not as elegant as the PHP equivalent 

इसके अलावा, मैं विभिन्न प्रकार की वस्तुओं के वापस जाने के लिए चाहता था कहते हैं कि स्ट्रिंग, पूर्णांक कहते हैं कि मैं वस्तुओं की एक सूची प्रदान और फिर प्रत्येक वस्तु ... नहीं बहुत

धन्यवाद कास्ट करने के लिए होगा।

+3

मैं बस एक सूची वापस भेजूंगा – keyser

+0

सूची लौटने में समस्या क्या है? –

+2

संपादित किया गया। जावा पर एक "पुराना हाथ" इस सवाल से नहीं पूछेगा, और मूल थोड़ा सा घबराहट के रूप में आया था। –

उत्तर

8

एक सामान्य ट्यूपल क्लास का उपयोग करना सबसे नज़दीक है जिसे मैं कल्पना कर सकता हूं।

public T3<String, Integer, Character> getValues() { 
    return new T3<String, Integer, Character>("string", 0, 'c'); 
} 

लेकिन कोई धारक:

public class T3<A, B, C> { 
    A _1; 
    B _2; 
    C _3; 
    T3(A _1, B _2, C _3) { 
     this._1 = _1; 
     this._2 = _2; 
     this._3 = _3; 
    } 
} 

यह कॉल प्राप्त करने वाला तरफ एक एक बयान निर्माता की अनुमति देता है, उदाहरण के लिए: एक विचार देने के लिए, तीन वापसी मूल्यों के लिए इस तरह के सामान्य प्रयोजन वर्ग कुछ इस तरह दिखाई दे सकता है कैली द्वारा उदाहरण निर्माण किया जाना है।

प्रत्येक वापसी मूल्यों की प्रत्येक संख्या को स्वयं की एक tuple-class की आवश्यकता होती है। Functional Java library में प्रदान की गई कुछ ऐसा हो सकती है। संदर्भ के लिए, यहां एक N-Tuple implementation है।

दो महत्वपूर्ण मामले के लिए java.util.AbstractMap.SimpleEntry करना होगा:

return new SimpleEntry<String, Integer>("string", 0); 

किसी भी तरह, मैं दो महत्वपूर्ण बिंदुओं को देखने के कई वापसी मूल्यों के लिए विचार करने के लिए:

  1. टाइप वापसी मान
  2. प्रत्येक वापसी मान का अर्थ

के रूप में यह रूप में बोरिंग बाहर ओर इशारा करते हुए है, मैं सभी प्रतिक्रिया मानों को पकड़ने के लिए एक अलग वर्ग बनाने की सिफारिश करता हूं और घोषणा करता हूं कि विधि वापसी प्रकार के रूप में। इस तरह प्रत्येक मूल्य का अर्थ हाइलाइट किया जा सकता है।

4

क्या आप List, Set, या Map वापस कर सकते हैं?

+1

मैं कर सकता हूं लेकिन यह बोझिल समाधान - मेरे प्रश्न – user1172468

5

आप इस प्रकार का हस्ताक्षर के साथ की तरह एक विधि है कर सकते हैं:

List<Holder> foobar(); 
1

आप इस उद्देश्य के लिए Collection वर्ग के किसी भी उपयोग कर सकते हैं। यह Lesson यह तय करने में आपकी सहायता कर सकता है कि आपके लिए सबसे उपयुक्त क्या है।

+0

में उदाहरण 2 का संदर्भ लें प्रतिक्रिया के लिए धन्यवाद, मुझे इस बारे में पता है, मैंने स्पष्ट किया है कि मैं इसके किसी भी सामान्य उपचार की तलाश में हूं। – user1172468

2

एक विस्तारित धारक रिटर्निंग एक सूची लौटने की तुलना में बेहतर लगता है:

class Holder { 
    int value1; 
    String value2; 
    Holder(int value1, String value2) {} 
} 

Holder foobar() { 
    return new Holder(1, "bar"); 
} 
+0

हां, संभवतः लेकिन वर्बोज़ वर्बोज़ वर्बोज़ :-(, प्रतिक्रिया के लिए धन्यवाद – user1172468

+0

@ user1172468 वर्बोसिटी जावा की अंतर्निहित संपत्ति है। कभी-कभी मैं सी ++ टाइपपीफ और ऑपरेटर ओवरलोड जादू के लिए लंबा रहता हूं, लेकिन वे गड़बड़ करते हैं, इसलिए मुझे जावा के लिए खुशी है वर्बोज़। –

2

आप एक ही प्रकार के एक से अधिक मान वापस जाने के लिए की जरूरत है, तो एक सूची या सेट उचित है। यह लौटने के लिए पूरी तरह से मान्य है, उदाहरण के लिए, एक चर के रूप में एक चर-लंबाई उपयोगकर्ता नाम सूची। यदि आप जानते हैं कि आप हमेशा एक निश्चित संख्या में मूल्य वापस करने जा रहे हैं, तो मैं एक सरणी का उपयोग करूंगा।उदाहरण के लिए, एक विधि है कि तीन अलग पूर्णांक के रूप में यूजर आईडी के किसी तरह का रिटर्न में, मैं का प्रयोग करेंगे:

public int[] getUserId(){ 
    int[] returnArray = new int[3]; 
    returnArray[0] = getFirstPart(); 
    returnArray[1] = getSecondPart(); 
    returnArray[2] = getThirdPart(); 

    return returnArray; 
} 

फोन करने वाले कोड में, मान प्राप्त करने के रूप में array[0], array[1] और array[2] के रूप में सरल है। यह संग्रह से कहीं अधिक आसान है, और आप कुछ भी तोड़ नहीं पाएंगे, क्योंकि उपयोगकर्ता आईडी को तीन पूर्णांक के रूप में परिभाषित किया जाता है।

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

संबंधित मुद्दे