जावा समाधान वास्तव में, समस्या यह है कि नहीं सभी भाव मान वापस जाने के लिए एक समाधान नहीं है तो आप जावा में यह नहीं लिख सकते हैं:
final String whatever = if (someCondition) {
"final value"
} else {
"other value"
}
तेजी से, जावा में प्रवृत्ति त्रिगुट ऑपरेटर का उपयोग करने के लिए है बजाय:
final String whatever = someCondition ? "final value" : "other value"
कौन सा है कि सीमित उपयोग के मामले के लिए ठीक है, लेकिन पूरी तरह से अस्थिर एक बार आप स्विच बयान और कई निर्माताओं के साथ काम कर शुरू करते हैं।
स्कैला का दृष्टिकोण यहां अलग है। सभी ऑब्जेक्ट निर्माण अंततः एक "प्राथमिक" कन्स्ट्रक्टर के माध्यम से गुजरना चाहिए, सभी अभिव्यक्तियां एक मान लौटाती हैं (भले ही यह Unit
है, जावा के Void
के बराबर), और कन्स्ट्रक्टर इंजेक्शन दृढ़ता से अनुकूल है। इसके परिणामस्वरूप ऑब्जेक्ट ग्राफ़ को निर्देशित एसाइक्लिक ग्राफ के रूप में साफ रूप से बनाया जा रहा है, और यह अपरिवर्तनीय वस्तुओं के साथ बहुत अच्छी तरह से काम करता है।
आप यह भी जानना चाहते हैं कि अलग-अलग परिचालनों में चर को घोषित करना और परिभाषित करना सामान्य रूप से एक से अधिक धागे से निपटने के दौरान एक बुरा अभ्यास है - और जब आप कम से कम उम्मीद करते हैं तो आपको नल और दौड़ की स्थिति को उजागर करने के लिए कमजोर छोड़ सकता है (हालांकि वस्तु निर्माण के दौरान यह वास्तव में एक समस्या नहीं है)। अपरिवर्तनीय मूल्यों का परमाणु निर्माण इस तरह का एक पहलू है जिसमें कार्यात्मक भाषाएं समवर्तीकरण से निपटने में मदद करती हैं।
इसका यह भी अर्थ है कि स्कैला कंपाइलर जावा भाषा स्पेक से कुछ जटिल रूप से जटिल प्रवाह विश्लेषण से बच सकता है।
पहले कहा गया है, स्काला रास्ता ™ है:
val whatever =
if (someCondition)
"final value"
else
"other value"
एक दृष्टिकोण है जो भी अन्य नियंत्रण संरचनाओं के लिए ऊपर मापता है:
val whatever = someCondition match {
case 1 => "one"
case 2 => "two"
case 3 => "three"
case _ => "other"
}
आपको लगता है कि पता चल जाएगा स्काला अनुभव का एक सा के साथ यह शैली कंपाइलर की आपकी सहायता करने में मदद करती है, और आपको खुद को कम बग के साथ प्रोग्राम लिखना चाहिए!
संकलक कैसे सुनिश्चित करेगा कि यह वास्तव में अंतर्निहित है? हाँ, यह संभव है - लेकिन कठिन, और जरूरत नहीं है। – delnan
क्योंकि प्रारंभिक बिंदु के बिंदु तक, मान * अनिर्धारित * है और केवल निम्न नियंत्रण प्रवाह के संदर्भ में समझ में आता है। कार्यात्मक प्रोग्रामिंग में, कोई अपरिभाषित मान नहीं हैं - और मूल्य - राज्य नहीं - केवल एकमात्र चीजें हैं जो महत्वपूर्ण हैं। – Dario
खैर, मूल रूप से कोई "अनियमित" नहीं है। JVM इस अवधारणा का समर्थन नहीं करता है। जावा में इन "अनियमित" फ़ील्ड में मूल्य 'शून्य' होता है। कक्षा प्रारंभिक तरीके के तरीके के कारण, कभी-कभी फ़ील्ड तक पहुंचना और फर्जी नल वापस लेना संभव होता है। यह कोड को जन्म देता है जो अशुभ दिखता है, लेकिन रनटाइम पर 'एनपीई 'फेंकता है। सीरियलाइजेशन/आरएमआई उस दृष्टिकोण में और अधिक समस्याएं जोड़ता है। यदि आप रुचि रखते हैं, तो "जावा पज़लर" में कुछ उदाहरण देखें। असल में: स्कैला अजीब चीज़ों को होने से रोकती है और अनियमित मूल्यों की आवश्यकता को कम कर देती है, क्योंकि सबकुछ एक अभिव्यक्ति है। – soc