जावा में कितने मान लौटाए गए हैं?


11

कभी-कभी आप एक फ़ंक्शन से कई मान वापस करना चाहते हैं। यह सामान्य रूप से जावा में कैसे किया जाता है?

एक विकल्प एक सरणी का उपयोग करना है, जैसे कि पायथन स्निपेट जो सूची या टपल लौटाता है:

value, success = read_unreliably()
if success:
    print value

एक अन्य विकल्प हैश / तानाशाह को लौटना होगा, जैसे कि जावास्क्रिप्ट उदाहरण:

var result = readUnreliably()
if (result.success) {
    alert(value);
}

एक और उद्देश्य इस उद्देश्य के लिए एक कस्टम ऑब्जेक्ट बनाना होगा, जैसे कि यह जावा उदाहरण:

ReadUnreliablyResult result = readUnreliably()
if (result.getSuccess()) {
    System.out.println(result.getValue());
}

बेशक, आप बस कुछ वैरिएबल वैरिएबल्स को स्टोर करने के लिए उपयोग कर सकते हैं, जिन्हें आपको चीजों को पास करने की बजाय जरूरत है, लेकिन चलिए हम बताते हैं कि यह कोई विकल्प नहीं है।


क्या "वास्तविक" जावा लोग वास्तव में सार्वजनिक गेटर्स का उपयोग करने की परेशानी से गुजरते हैं और इस तरह से छोटे आंतरिक वर्गों पर फ़ील्ड्स को छिपाने के लिए बस जाते हैं? बस उत्सुक।
क्रिस किसान

3
हाँ, सबसे करते हैं। चूंकि कई फ्रेमवर्क जावाबैन मानक की अपेक्षा करते हैं, आप गेटर्स और सेटर नहीं होने पर पछतावा कर सकते हैं। किसी भी स्थिति में, आपका आईडीई आपके लिए उन्हें उत्पन्न करेगा।
एरिक विल्सन

3
या आप केवल YAGNI सिद्धांत के आधार पर उन्हें छोड़ सकते हैं। लेकिन ऐसा लगता नहीं है जितनी बार कोई उम्मीद कर सकता है।
MatrixFrog

@FarmBoy: मुझे लगता है कि मैं सेम और इस तरह के लिए समझता हूं, लेकिन ओपी का मतलब है कि यह सिर्फ एक एकल वर्ग है जिसे कई मूल्यों को वापस करने के लिए डिज़ाइन किया गया है।
क्रिस फार्मर

@ChrisFarmer मुझे लगता है कि इस संदर्भ में, मैंने कभी भी 'वास्तविक' जावा प्रोग्रामर को इस उद्देश्य के लिए एक वर्ग बनाते नहीं देखा।
एरिक विल्सन

जवाबों:


26

यह सामान्य रूप से जावा में कैसे किया जाता है?

दर्दनाक।

एक विकल्प एक सरणी का उपयोग करना है, जैसे कि पायथन स्निपेट जो एक सूची या ट्यूपल लौटाता है ...

एक अन्य विकल्प है कि इस जावास्क्रिप्ट उदाहरण की तरह हैश / तानाशाही लौटाई जाए ...

ये तकनीकें जावा में अच्छा काम नहीं करती हैं; मान को ऑब्जेक्ट से डाउनकास्ट करना होगा।

एक और इस उद्देश्य के लिए एक कस्टम ऑब्जेक्ट बनाने के लिए होगा, इस जावा उदाहरण की तरह ...

यह सबसे आम है, लेकिन उन सभी छोटी कक्षाओं को बनाना थकाऊ है। C ++ में std :: pair का उपयोग करना आम है लेकिन यह आमतौर पर जावा में नहीं किया जाता है।

लोम्बोक के साथ यह बहुत कम कस्टम ऑब्जेक्ट बनाने में आसान है:

@RequiredArgsConstructor
public class X {
  private final boolean status;
  private final byte[] data;

}


10
"यह सामान्य रूप से जावा में कैसे किया जाता है?" "दुखद।" एक जावा डेवलपर के रूप में lol मुझे आपके लिए +1 करना होगा
TheLQ

एक कॉम्पैक्ट अपरिवर्तनीय संरचना जैसी कक्षा का उपयोग करना इतना दर्दनाक नहीं है ... यह वास्तव में एक सी संरचना लिखने की तरह है ...
गुइलूम

1
@ गिलूम - यकीन है, लेकिन उन सभी छोटी चीजों को समय और स्थान दोनों में जोड़ा जाता है। मुझे नहीं पता कि जावा समुदाय ने "क्लास पेयर <T1, T2> {T1 पहले; पब्लिक T2 सेकंड; ...}" जैसे जेनरिक का एक मानक सेट क्यों नहीं अपनाया है; आधुनिक भाषाओं में आप "a, b" लौटाते हैं; और फिर "x, y = f ()" लिखें;
केविन क्लाइन

1
मुझे यकीन है कि कुछ 'प्राचीन' भाषा भी ऐसा करने में सक्षम हैं :) IMHO मैंने पाया कि कई रिटर्न मान कुल गड़बड़ी पैदा कर सकते हैं, और यदि आपको एक और रिटर्न फ़ील्ड जोड़ने की आवश्यकता है, तो आपको बस अपनी संरचना को कक्षा के बिना अपडेट करना होगा। अपना तरीका बदलें
गिलौम

1
वह "दर्द से।" जब मैंने ऐसी ही स्थितियों को पूरा किया, तो मुझे वास्तव में जावा डेवलपर के रूप में जो महसूस हुआ, ठीक है।
Artjom

13

हाँ, जिस तरह से एक बनाने के लिए struct/ tuple/ recordजावा में एक वर्ग बनाने के द्वारा है। यदि यह केवल आंतरिक उपयोग के लिए है, तो मैं सार्वजनिक क्षेत्रों के साथ एक छोटी अपरिवर्तनीय संरचना जैसी कक्षा का उपयोग करना पसंद करता हूं।

उदाहरण:

public class Unreliably {
    public final boolean success;
    public final int value;
    public Unreliably(boolean success, int value) {
        this.success = success; this.value = value;
    }
}

यह स्काला में करना बहुत आसान है:

case class Unreliably(success: Boolean, value: Int)

8
दरअसल, स्काला में, आप आमतौर पर सिर्फ एक वापसी करेंगे Tuple2[Boolean, Int]। हालांकि इस विशिष्ट उदाहरण में, आप वापस लौट आएंगे Option[Int]
जोर्ग डब्ल्यू मित्तग

2
तो यह क्रिस किसान के सवाल (क्यू की टिप्पणियों में) का जवाब देता है कि वास्तविक जावा लोग जरूरी नहीं कि छोटे आंतरिक वर्गों के लिए गेटर्स और सेटर बनाते हैं। आप एक "असली" जावा व्यक्ति हैं, है ना?
माइक एम। लिन

2
अन्य खबरों में, कोई सच्चे स्कॉट्समैन नहीं हैं।
जोसेफ वीसमैन

5

आपके द्वारा दिए गए उदाहरण के लिए, एक अपवाद को फेंकना इसे संभालने का सबसे मानक तरीका होगा:

try {
    result = readUnreliably();
    System.out.println(result);
} (catch IOException e) {
    System.out.println("Could not read file");
}

इसके अलावा, यदि आप ऐसे कार्यों का प्रयास करते हैं जो "डू वन थिंग" हैं, तो कई मानों को लौटाने की सुविधा कम आवश्यक है, हालांकि कभी-कभी सुविधाजनक होती है।


4

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

public class Pair<A, B>
{
    ...
}

1
हालांकि यह वास्तव में कुछ अपठनीय कोड के लिए बनाता है। यदि कोई विधि वापस आती है Pair<String, Integer>, तो इसका क्या मतलब है? ये मूल्य क्या दर्शाते हैं? आप संभवतः विधि के कार्यान्वयन को पढ़े बिना नहीं जान सकते।
सारा

1

जावा में, आपका फ़ंक्शन एक वस्तु लौटाएगा (या शायद एक विफलता के मामले में अशक्त)। इस तरह, डेटा के कई टुकड़े वापस किए जा सकते हैं।


1

जावा में कई चर वापस करने का कोई स्पष्ट तरीका नहीं है, हालांकि कुछ दृष्टिकोण हैं:

  1. पहला एरे का रास्ता जाना है। यह केवल तभी काम करता है जब आपके पास सब कुछ समान डेटा प्रकार के रूप में हो या अस्थायी रूप से उन्हें एक प्रकार में परिवर्तित कर सके।
  2. दूसरा तरीका कई चर प्रकारों को स्थानांतरित करने के उद्देश्य के लिए एक वर्ग बनाना है। मेरे काम में हम इन्हें डीटीओ या डेटा ट्रांसफर ऑब्जेक्ट के रूप में संदर्भित करते हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.