जावा वर्गों के सदस्यों में से दो पूरी तरह से अलग अलग प्रकार के होते हैं - उदाहरण के सदस्यों (जैसे BigDecimal.plus
के रूप में) और स्थिर सदस्य (जैसे BigDecimal.valueOf
)। स्कैला में, केवल इंस्टेंस सदस्य हैं। यह वास्तव में एक सरलीकरण है! लेकिन यह एक समस्या छोड़ देता है: हम valueOf
जैसे तरीके कहां डालते हैं? वहीं वस्तुएं उपयोगी होती हैं।
class BigDecimal(value: String) {
def plus(that: BigDecimal): BigDecimal = // ...
}
object BigDecimal {
def valueOf(i: Int): BigDecimal = // ...
}
आप गुमनाम वर्ग की घोषणा और उसके एक भी इन्स्टेन्शियशन के रूप में इस देख सकते हैं:
class BigDecimal$object {
def valueOf(i: Int): BigDecimal = // ...
}
lazy val BigDecimal = new BigDecimal$object
जब स्काला कोड को पढ़ने के लिए, यह मूल्यों से प्रकार भेद करने के लिए महत्वपूर्ण है। मैंने IntelliJ को हाइटलाइट प्रकारों को नीले रंग में कॉन्फ़िगर किया है।
val ls = List.empty[Int] // List is a value, a reference the the object List
ls: List[Int] // List is a type, a reference to class List
जावा में स्केल में हटाए गए जटिलता की एक और डिग्री भी है - फ़ील्ड और विधियों के बीच भेद। इंटरफेस पर फ़ील्ड की अनुमति नहीं है, सिवाय इसके कि वे स्थिर और अंतिम हैं; तरीकों को ओवरराइड किया जा सकता है, अगर उप-वर्ग में फिर से परिभाषित किया गया है तो इसके बजाय फ़ील्ड छुपाए गए हैं। स्कैला इस जटिलता से दूर है, और केवल प्रोग्रामर के लिए विधियों का खुलासा करता है।
अंत में, आपके दूसरे प्रश्न का एक ग्लिब उत्तर: यदि आप कोई ऑब्जेक्ट घोषित नहीं करते हैं, तो आप प्रोग्राम कभी नहीं चल सकते हैं, क्योंकि आप स्केल में public static void main(String... args) {}
के बराबर परिभाषित करने के लिए, आपको कम से कम एक ऑब्जेक्ट चाहिए!
स्केल को "जटिल" होने के दृष्टिकोण पर विचार क्यों किया जाता है?प्रत्येक भाषा के साथ काम करने के बाद स्कैला का समाधान अब तक का सबसे आसान है, खासकर जब विरासत और उप-टाइपिंग खेल में आती है। – soc