আমার খুব সাধারণ প্রশ্ন আছে - স্কালায় অবজেক্ট তৈরি করার সময় আমাদের নতুন কীওয়ার্ডটি কখন প্রয়োগ করা উচিত? যখন আমরা কেবল জাভা অবজেক্টগুলি ইনস্ট্যান্ট করার চেষ্টা করি তখনই কি হয়?
উত্তর:
new
আপনি যখন কোনও class
নিজস্ব নির্মাণকারীর উল্লেখ করতে চান তখন কীওয়ার্ডটি ব্যবহার করুন :
class Foo { }
val f = new Foo
ফেরত new
আপনি সহচর বস্তুর উল্লেখ করা হয় apply
পদ্ধতি:
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)
test@5c79cc94
> println(Foo())
7
এবং, যেহেতু আপনি জাভা ক্লাসগুলি উল্লেখ করেছেন: হ্যাঁ - জাভা ক্লাসগুলিতে খুব কমই কোনও apply
পদ্ধতির সহকর্মী অবজেক্ট থাকে তাই আপনাকে অবশ্যই ব্যবহার করতে হবে new
এবং প্রকৃত শ্রেণির নির্মাতা।
যখন আমরা কেবল জাভা বস্তুগুলিকে ইনস্ট্যান্ট করার চেষ্টা করি তখনই কি হয়?
একদমই না. আপনি স্কেলে বাদ দিলে দুটি সাধারণ কেস থাকে new
। সিঙ্গেলটন বস্তুগুলির সাথে (যা প্রায়শই স্থির ফাংশনগুলি সংরক্ষণ করতে এবং আপনি জাভাতে দেখতে পারা যা একই রকম ফ্যাক্টরি হিসাবে ব্যবহৃত হয়):
scala> object LonelyGuy { def mood = "sad" }
defined module LonelyGuy
scala> LonelyGuy
res0: LonelyGuy.type = LonelyGuy$@3449a8
scala> LonelyGuy.mood
res4: java.lang.String = sad
একটি সঙ্গে কেস শ্রেণীর (আসলে নীচে সেখানে বর্গ অবজেক্ট = হয় সহচর প্যাটার্ন, যেমন থাকার বর্গ এবং বস্তুর একই নামের):
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 = Foo@2ad6a0
// 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} = $anon$1@10ee5b8
scala> res2.bar
res3: java.lang.String = baz
আমরা যখন কেবল জাভা অবজেক্টগুলিকে ইনস্ট্যান্ট করার চেষ্টা করি তখনই কি হয়?
স্কটি 3 দিয়ে (যা ২০২০ সালের মাঝামাঝি সময়ে প্রকাশ করা উচিত, আট বছর পরে) ডটিটির উপর ভিত্তি করে : কখনই নয়।
এই থ্রেডেরnew
মতো স্ক্যালাল 3 " " নামবে
কোনও প্রয়োগ পদ্ধতি প্রয়োগ না করা সত্ত্বেও স্রষ্টা অ্যাপ্লিকেশনগুলি ক্লাসের উদাহরণ তৈরি করতে সাধারণ ফাংশন কল সিনট্যাক্স ব্যবহার করার অনুমতি দেয়।
উদাহরণ:
class StringBuilder(s: String) {
def this() = this(s)
}
StringBuilder("abc") // same as new StringBuilder("abc")
StringBuilder() // same as new StringBuilder()
স্রষ্টা অ্যাপ্লিকেশনগুলি কেবলমাত্র কেস ক্লাসগুলির জন্য সরবরাহ করা কোনও কার্যকারিতা সাধারণকরণ করে তবে কীভাবে এটি অর্জন করা যায় তার ব্যবস্থাটি কিছুটা আলাদা।
স্বতঃ উত্পাদিত প্রয়োগ পদ্ধতির পরিবর্তে, আমরা একটি ফাংশন কলে একটি নতুন সম্ভাব্য ব্যাখ্যার যোগ করিf(args)
।