มีความแตกต่างระหว่างวัตถุกรณีและวัตถุในสกาล่า?
case
เพื่อจับคู่รูปแบบมันเป็นเพียงน้ำตาล การใช้งานของunapply
คุณเองก็เป็นงาน
มีความแตกต่างระหว่างวัตถุกรณีและวัตถุในสกาล่า?
case
เพื่อจับคู่รูปแบบมันเป็นเพียงน้ำตาล การใช้งานของunapply
คุณเองก็เป็นงาน
คำตอบ:
คลาส Case แตกต่างจากคลาสปกติที่ได้รับ:
equals
และhashCode
toString
และscala.Product
ของการทำงานที่พวกเขาได้รับจากการสืบทอดโดยอัตโนมัติจาก การจับคู่รูปแบบเท่ากับและ hashCode ไม่ได้มีความสำคัญอะไรสำหรับซิงเกิลตัน (เว้นแต่คุณจะทำบางสิ่งที่เสื่อมโทรมจริงๆ) ดังนั้นคุณค่อนข้างจะได้รับการทำให้เป็นอนุกรมดีtoString
และวิธีการบางอย่างที่คุณอาจไม่เคยใช้
object
เหมือนกับซิงเกิล มันไม่ใช่. ค่อนข้างเป็นสิ่งที่มันบอกว่ามันคือวัตถุคือการประกาศและการสร้างอินสแตนซ์ในหนึ่ง สิ่งนี้ จำกัดobject
ให้กับอินสแตนซ์เดียวหากกำหนดไว้ในขอบเขตของแพคเกจซึ่งทำให้เป็นผลเดี่ยว แต่ถ้ากำหนดไว้ในขอบเขตนั้น หากกำหนดไว้ในคลาสคุณสามารถมีอินสแตนซ์ได้มากเท่าคลาส (มันเป็นอินสแตนซ์ที่ขี้เกียจดังนั้นจึงไม่จำเป็นต้อง 1-1) และวัตถุภายในเหล่านั้นอาจถูกนำมาใช้เป็นปุ่มแฮชได้ดีทำให้ค่าเริ่มต้นเท่ากับ / hashCode ที่สมเหตุสมผลมาก
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
วัตถุที่กำหนด foocase
ความแตกต่างของการทำให้เป็นอันดับ:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo $ ไม่สามารถส่งไปยัง scala.Serializable
... 43 elided
scala> foocase.asInstanceOf[Serializable]
res1: Serializable = foocase
toString ความแตกต่าง:
scala> foo
res2: foo.type = foo $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase
กรณีวัตถุโดยนัยมาพร้อมกับการใช้งานของวิธีการ toString เท่ากับและ hashCode แต่วัตถุที่เรียบง่ายไม่ได้ วัตถุเคสสามารถทำเป็นอนุกรมได้ในขณะที่วัตถุธรรมดาไม่สามารถทำได้ซึ่งทำให้วัตถุเคสมีประโยชน์มากเช่นเดียวกับข้อความที่มี Akka-Remote การเพิ่มคีย์เวิร์ด case ก่อนอ็อบเจ็กต์คีย์เวิร์ดทำให้อ็อบเจ็กต์เป็นอนุกรม
คล้ายกับcase class
และclass
เราเพิ่งใช้case object
แทนcase class
เมื่อไม่มีฟิลด์ใด ๆ ที่แสดงข้อมูลสถานะเพิ่มเติม
เรารู้จักวัตถุและ "case class" มาก่อน แต่ "case object" เป็นการผสมกันของทั้งสองอย่างนั่นคือ singleton คล้ายกับวัตถุและมีสำเร็จรูปจำนวนมากในคลาส case ความแตกต่างเพียงอย่างเดียวคือสร้างสำเร็จรูปสำหรับวัตถุแทนที่จะเป็นคลาส
วัตถุกรณีจะไม่มาพร้อมกับวัตถุด้านล่าง:
ใช้วิธียกเลิกการใช้ ที่นี่ไม่มีวิธีการคัดลอกเนื่องจากนี่เป็นซิงเกิลตัน ไม่มีวิธีการเปรียบเทียบความเท่าเทียมกันของโครงสร้าง ไม่มีตัวสร้างเช่นกัน