scala - स्कैला में "नया" कीवर्ड
new-operator keyword (2)
मेरे पास एक बहुत ही सरल सवाल है - स्कैला में ऑब्जेक्ट्स बनाते समय हमें नया कीवर्ड कब लागू करना चाहिए? क्या यह तब होता है जब हम केवल जावा ऑब्जेक्ट्स को तुरंत चालू करने का प्रयास करते हैं?
क्या यह तब होता है जब हम जावा वस्तुओं को तुरंत चालू करने का प्रयास करते हैं?
हर्गिज नहीं। जब आप स्कैला में new
छोड़ देते हैं तो दो सामान्य मामले होते हैं। सिंगलटन ऑब्जेक्ट्स के साथ (जिसका उपयोग अक्सर स्थिर कार्यों को संग्रहीत करने के लिए किया जाता है और एक प्रकार के फैक्ट्री के रूप में जो आप जावा में देख सकते हैं):
scala> object LonelyGuy { def mood = "sad" }
defined module LonelyGuy
scala> LonelyGuy
res0: LonelyGuy.type = [email protected]
scala> LonelyGuy.mood
res4: java.lang.String = sad
एक केस कक्षाओं के साथ (वास्तव में, नीचे वर्ग + वस्तु = companion पैटर्न हैं, उदाहरण के लिए एक ही नाम के साथ कक्षा और वस्तु है):
scala> case class Foo(bar: String)
defined class Foo
scala> Foo("baz")
res2: Foo = Foo(baz)
तो जब आप एक साधारण कक्षाओं के साथ काम करते हैं, तो नियम जावा के समान होते हैं।
scala> class Foo(val bar: String)
defined class Foo
scala> new Foo("baz")
res0: Foo = [email protected]
// will be a error
scala> Foo("baz")
<console>:8: error: not found: value Foo
Foo("baz")
बोनस, स्कैला में एक अज्ञात वर्ग है, जिसे इस तरह बनाया जा सकता है:
scala> new { val bar = "baz" }
res2: java.lang.Object{val bar: java.lang.String} = [email protected]
scala> res2.bar
res3: java.lang.String = baz
जब आप किसी class
के स्वयं के कन्स्ट्रक्टर को संदर्भित करना चाहते हैं तो new
कीवर्ड का उपयोग करें:
class Foo { }
val f = new Foo
अगर आप साथी ऑब्जेक्ट की apply
विधि का जिक्र कर रहे हैं तो new
छोड़ दें:
class Foo { }
object Foo {
def apply() = new Foo
}
// Both of these are legal
val f = Foo()
val f2 = new Foo
यदि आपने केस क्लास बनाया है:
case class Foo()
स्कैला गुप्त रूप से आपके लिए एक साथी वस्तु बनाता है, इसे इस में बदल देता है:
class Foo { }
object Foo {
def apply() = new Foo
}
तो आप कर सकते हैं
f = Foo()
अंत में, ध्यान रखें कि ऐसा कोई नियम नहीं है जो कहता है कि साथी apply
करने के लिए निर्माता को प्रॉक्सी होना चाहिए:
class Foo { }
object Foo {
def apply() = 7
}
// These do different things
> println(new Foo)
[email protected]
> println(Foo())
7
और, चूंकि आपने जावा कक्षाओं का उल्लेख किया है: हाँ - जावा कक्षाओं में शायद ही कभी apply
विधि के साथ साथी वस्तुएं हों, इसलिए आपको new
और वास्तविक वर्ग के निर्माता का उपयोग करना होगा।