2012-09-23 8 views
25

http://en.wikipedia.org/wiki/?: जैसे पृष्ठों में टर्नरी/सशर्त ऑपरेटर ?: सशर्त असाइनमेंट के लिए उपयोग किया जाता है। मैंने विधि कॉलिंग के लिए इसका उपयोग करने की कोशिश की, जैसे:क्या जावा का टर्नरी/सशर्त ऑपरेटर (? :) मूल्यों को निर्दिष्ट करने के बजाय विधियों को कॉल करने के लिए उपयोग किया जा सकता है?

(condition) ? doThis() : doThat(); 

दोनों विधियां शून्य हो गईं। जावा मुझे बताता है कि यह एक बयान नहीं है।

तो, मुझे लगता है कि मैं सशर्त विधि कॉलिंग नहीं कर सकता ... या मैं कर सकता हूं?

+14

नहीं, ऐसा नहीं। बस एक सामान्य व्यक्ति की तरह 'if' का उपयोग करें। –

+1

मेरा मानना ​​है कि टर्नरी ऑपरेटर को एक शर्त के साथ एक प्रकार के उदाहरण के लिए मान असाइन करना होता है। जिस तरह से आप इसे सुझाव दे रहे हैं वह प्रारूप को संतुष्ट नहीं कर रहा है। –

+0

@codesparkle - बहुत सी जगह नहीं। यदि (शर्त) {doThis();} else {doThat();} – tehdoommarine

उत्तर

18

इस मामले में एक विधि की तरह टर्नरी ऑपरेटरों के बारे में सोचें। कह रही है a ? b : c (इरादों और मकसदों आप विचार कर रहे हैं, तो lasseespeholt की टिप्पणी देखें) स्यूडोकोड विधि बुला के बराबर है:

ternary(a, b, c) 
    if a 
     return b 
    else 
     return c 

जिसके कारण लोगों x = a ? b : c तरह बातें कह सकते हैं; यह मूल रूप से x = ternary(a, b, c) कहने जैसा है। जब आप कहते हैं कि (condition) ? doThis() : doThat(), आप प्रभाव में हैं कह रही:

if condition 
    return doThis() 
else 
    return doThat() 

देखो अगर हम वे क्या लौट

if condition 
    return ??? 
else 
    return ??? 

यह भी समझ में यह विचार करने के लिए नहीं है के लिए तरीकों स्थानापन्न करने की कोशिश क्या होता है । doThis() और doThat() कुछ भी वापस न करें, क्योंकि void एक तत्काल प्रकार नहीं है, इसलिए ternary विधि कुछ भी वापस नहीं कर सकता है, इसलिए जावा नहीं जानता कि आपके कथन और शिकायत के साथ क्या करना है।

इसके आसपास के तरीके हैं, लेकिन वे सभी बुरे अभ्यास हैं (आप वापसी विधियों के लिए अपने तरीकों को संशोधित कर सकते हैं लेकिन वे जो कुछ भी लौटते हैं उसके साथ कुछ भी नहीं करते हैं, आप अपनी विधियों को कॉल करने वाले नए तरीकों को बना सकते हैं और फिर वापसी शून्य, आदि)। इस मामले में आप if कथन का उपयोग करके बहुत बेहतर हैं।

संपादित करें इसके अलावा, यहां तक ​​कि एक बड़ा मुद्दा भी है। यहां तक ​​कि यदि आप मूल्यों को वापस कर रहे थे, तो जावा किसी भी अर्थ में a ? b : c एक कथन पर विचार नहीं करता है।

+1

" एक कह रहा है? बी: सी छद्म कोड विधि को कॉल करने के बराबर है "<- नहीं। उस स्थिति पर विचार करें जहां 'बी' या' सी 'के दुष्प्रभाव हैं। इसलिए आपको अपने बाद के उदाहरणों में लम्बास के रूप में विचार करने की आवश्यकता है। –

+0

सच है। मैं स्पष्ट करता हूं कि मैं सरलीकृत कर रहा हूं। – Jodaka

+3

@ जोडाका, मैं आपके संपादन को सही उत्तर के रूप में मानता हूं क्योंकि यह वास्तव में मूल्य लौटने के बारे में नहीं है, यह जावा के बारे में है? बी: सी एक बयान के रूप में। – Kareem

2

टर्नरी ऑपरेटर बस सिंटैक्टिक चीनी है।
यह कोड को पढ़ने/लिखने में आसान बनाता है, लेकिन यह वास्तविक कार्यक्षमता को जोड़ता नहीं है।
इसका प्राथमिक उपयोग कोड की कई पंक्तियों को एक पंक्ति में संपीड़ित करना था, और कुछ स्थितियों के आधार पर स्ट्रिंग्स का निर्माण करते समय बहुत उपयोगी था।

उदाहरण के लिए।

Collection<?> col = ... 
System.out.println("There " + (col.size()==1 ? "is" : "are") + " " 
    + col.size() + " " + (col.size()==1 ? "element" : "elements") 
    + " in the collection"); 

Collection<?> col = ... 
String message = "There "; 
if(col.size()==1) 
    message += "is"; 
else 
    message += "are"; 
message += " "+col.size() 
if(col.size()==1) 
    message += " element"; 
else 
    message += " elements"; 
message += " in the collection"; 
System.out.println(message); 

आप देख सकते हैं के बजाय

, यह कोड सरल करता है।
(ध्यान दें: दूसरे उदाहरण में यह स्ट्रिंग संयोजन के बजाय StringBuilder उपयोग करने के लिए बेहतर है)

लेकिन (condition) ? doThis() : doThat(); के बाद से (वापसी मूल्यों के बिना) है if(condition) doThis(); else doThat(); वही अर्थ वहाँ एक ही बात लिख के दो तरीके हो सकता है, बिना कार्यक्षमता जोड़नाvoid तरीकों यह अब भी समर्थन हासिल है


तो :

    प्रोग्रामर के लिए
  • :: यह केवल बातें जटिल होता कोड त्रिगुट ऑपरेटर के कार्यान्वयन के लिए एक समान
  • नहीं है नहीं, सख्त विधि कॉलिंग के लिए टर्नरी ऑपरेशन का उपयोग नहीं किया जा सकता है। इसके बजाए उपयोग करें:

    if(condition) 
        doThis(); 
    else 
        doThat(); 
    
1

टर्नरी (सशर्त) ऑपरेटर एक मूल्य देता है। यदि आपकी विधियां नहीं हैं, तो उन्हें ऑपरेटर के हिस्सों के रूप में उपयोग नहीं किया जा सकता है (जहां यह मान लेता है)।

इसे बेहतर समझने के लिए, आइए एक साधारण बाइनरी ऑपरेटर के बारे में सोचें: +। यह इस तरह से काम करता है:

<eval1> + <eval2> --> <value> 

इसे 2 मूल्यांकन योग्य भागों की आवश्यकता है, और दूसरा लौटाता है। आपके द्वारा लिखे गए हैं

doThis() + doThat(); 

या यहाँ तक कि

gimmeAValue = doThis() + doThat(); 

यह विफल हो जाएगा, न तो doThis() है और न ही doThat() कुछ भी करने के लिए मूल्यांकन के रूप में (वे "वापसी" void)। बेशक, <eval1> और <eval2> दोनों + ऑपरेटर उन्हें संभाल सकते हैं और कुछ प्रकार के मान को वापस कर सकते हैं, तो कुछ "संगत" प्रकार का होना चाहिए।

अब त्रिगुट ऑपरेटर देखते हैं:

<evalBoolean> ? <eval1> : <eval2> --> <value> 

यह 3 मूल्यांकित भागों लेता है, और एक मान देता है।

पहले मूल्यांकन योग्य भाग को बुलियन के रूप में संकलक द्वारा समझा जा सकता है (जा सकता है)। इसका उपयोग यह तय करने के लिए किया जाएगा कि अन्य 2 मूल्यांकन योग्य हिस्सों को किस प्रकार वापस किया जाना है।

अन्य दो मूल्यांकन योग्य भागों, अच्छी तरह से ... मूल्यांकन योग्य होना चाहिए। किसी चीज़ के लिए। कुछ प्रकार का

दूसरे शब्दों में: टर्नरी सशर्त ऑपरेटर का उद्देश्य कोड को ब्रांचिंग के रूप में कुछ नहीं करना है। इस तरह से प्रयुक्त:

gimmeAValue = testMe() ? returnThis() : returnThat(); 
संबंधित मुद्दे

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