স্কেল ক্ষেত্রে কেস অবজেক্ট এবং অবজেক্টের মধ্যে কোনও পার্থক্য আছে?
case
প্যাটার্ন ম্যাচিংয়ের জন্য এটি ব্যবহার করার দরকার নেই, এটি কেবল চিনি। unapply
নিজেকে বাস্তবায়ন করা কাজটি করে।
স্কেল ক্ষেত্রে কেস অবজেক্ট এবং অবজেক্টের মধ্যে কোনও পার্থক্য আছে?
case
প্যাটার্ন ম্যাচিংয়ের জন্য এটি ব্যবহার করার দরকার নেই, এটি কেবল চিনি। unapply
নিজেকে বাস্তবায়ন করা কাজটি করে।
উত্তর:
কেস ক্লাসগুলি নিয়মিত ক্লাসগুলির মধ্যে পৃথক হয় সেগুলি থেকে পৃথক:
equals
এবংhashCode
toString
, এবংscala.Product
। প্যাটার্ন ম্যাচিং, সমান এবং হ্যাশকোড সিঙ্গলটনের জন্য খুব বেশি গুরুত্ব দেয় না (যদি আপনি সত্যিকার অর্থে কিছুটা অবনমিত করেন না) তবে আপনি কেবলমাত্র সিরিয়ালাইজেশন পেয়ে যাচ্ছেন, একটি দুর্দান্ত toString
এবং কিছু পদ্ধতি যা আপনি সম্ভবত ব্যবহার করবেন না।
object
একটি সিঙ্গলটনের মতো একই রূপকথার জন্ম দেয়। এইটা না. বরং এটি হ'ল এটি যা বলে তা হ'ল একটি বস্তু, মানে একটিতে ঘোষণা এবং তাত্পর্য। এটি object
প্যাকেজ স্কোপে সংজ্ঞায়িত করা হলে এটি একক ক্ষেত্রে সীমাবদ্ধ করে, যা কার্যকরভাবে এটিকে সিঙ্গেলটন করে তোলে, তবে কেবলমাত্র স্কোপে সংজ্ঞায়িত হয়। যদি কোনও শ্রেণীর অভ্যন্তরে সংজ্ঞায়িত করা হয় তবে আপনার নিজের বর্গের মতো অনেকগুলি উদাহরণ থাকতে পারে (এটি অলসভাবে ইনস্ট্যান্টেশনযুক্ত, সুতরাং এটি অগত্যা 1-1 নয়)। এবং এই অভ্যন্তরীণ অবজেক্টগুলি হ্যাশ কী হিসাবে খুব ভাল ব্যবহার করা যেতে পারে, ডিফল্ট সমান / হ্যাশকোডকে খুব বুদ্ধিমান করে তোলে।
case object
শ্রেণি নয়, কেন এটি সঠিক উত্তর?
case class
এবং এ এর মধ্যে পার্থক্য নিয়ে কাজ করে class
। প্রশ্ন মধ্যে পার্থক্য সম্পর্কে case object
এবং object
।
এখানে একটি পার্থক্য - কেস অবজেক্টস Serializable
বৈশিষ্ট্যটি প্রসারিত করে , তাই সেগুলি ক্রমিকায়িত করা যায়। নিয়মিত বস্তুগুলি ডিফল্টরূপে পারে না:
scala> object A
defined module A
scala> case object B
defined module B
scala> import java.io._
import java.io._
scala> val bos = new ByteArrayOutputStream
bos: java.io.ByteArrayOutputStream =
scala> val oos = new ObjectOutputStream(bos)
oos: java.io.ObjectOutputStream = java.io.ObjectOutputStream@e7da60
scala> oos.writeObject(B)
scala> oos.writeObject(A)
java.io.NotSerializableException: A$
extends Serializable
করা একই কৌশল করা উচিত।
scala> object foo
সংজ্ঞায়িত বস্তু foo
scala> case object foocase
সংজ্ঞায়িত অবজেক্ট ফোকাস
ক্রমিকায়নের পার্থক্য:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo বিন্যাস $ scala.Serializable কাস্ট করা যাবে না
... 43 লুপ্ত
scala> foocase.asInstanceOf[Serializable]
res1: সিরিয়ালাইজযোগ্য = ফোকাস
টু স্ট্রিং পার্থক্য:
scala> foo
res2: foo.type = foo 7 @ 7bf0bac8
scala> foocase
res3: foocase.type = ফোকাস
কেস অবজেক্টস স্পষ্টভাবে টু স্ট্রিং, ইক্যুয়াল এবং হ্যাশকোডের পদ্ধতিগুলির প্রয়োগের সাথে আসে তবে সাধারণ বস্তুগুলি তা দেয় না। কেস অবজেক্টগুলি সিরিয়ালাইজ করা যায় যখন সাধারণ অবজেক্টগুলি পারে না, যা কেস অবজেক্টগুলিকে আক্কা-রিমোটের বার্তা হিসাবে খুব দরকারী করে তোলে। অবজেক্ট কীওয়ার্ডের আগে কেস কীওয়ার্ড যুক্ত করা বিষয়টিকে সিরিয়ালযোগ্য করে তোলে।
আমরা বস্তু এবং "কেস ক্লাস" এর আগে জানি। তবে "কেস অবজেক্ট" হ'ল উভয়ের মিশ্রণ, এটি কোনও বস্তুর অনুরূপ সিঙ্গলটন এবং কেস ক্লাসের মতো প্রচুর বয়লারপ্লেট সহ। পার্থক্যটি কেবল হ'ল বয়লারপ্লেট কোনও শ্রেণীর পরিবর্তে কোনও বস্তুর জন্য করা হয়।
কেস অবজেক্টগুলি নীচেরগুলির সাথে আসে না:
প্রয়োগ, আন-প্রয়োগ পদ্ধতি। এখানে কোনও অনুলিপি পদ্ধতি নেই কারণ এটি একটি সিঙ্গলটন। কাঠামোগত সাম্য তুলনা জন্য কোন পদ্ধতি। পাশাপাশি কোনও নির্মাণকারীও নেই।