ความแตกต่างระหว่างวัตถุกรณีและวัตถุ


226

มีความแตกต่างระหว่างวัตถุกรณีและวัตถุในสกาล่า?


3
เขามีประเด็น - ไม่จำเป็นต้องมีวัตถุเคสเพื่อให้สามารถจับคู่รูปแบบกับมันได้ ฉันคิดว่านี่ไม่ได้ตอบคำถามก่อนหน้านี้ ...
axel22

3
ฉันคิดว่าจะมีความแตกต่างในพฤติกรรมการจับคู่รูปแบบ แต่ทั้งสองกรณีวัตถุและวัตถุปกติทำงานในลักษณะเดียวกันในรูปแบบที่ตรงกับ AFAIK มันค่อนข้างยากที่จะหาข้อมูลใด ๆ เกี่ยวกับวัตถุเคสดังนั้นฉันรอคอยที่จะมีคนให้ความรู้แก่เรา
อายุ Mooij

4
ไม่จำเป็นต้องใช้caseเพื่อจับคู่รูปแบบมันเป็นเพียงน้ำตาล การใช้งานของunapplyคุณเองก็เป็นงาน
Raphael

1
คำตอบที่ยอมรับนั้นไม่ได้ตอบคำถามดังที่กล่าวไว้ในความคิดเห็นของมัน สายเกินไปที่จะสร้างความแตกต่าง แต่ควรสังเกต
itsbruce

มันไม่สายเกินไปที่จะแก้ไขคำตอบที่ยอมรับได้ การแก้ไขจะได้รับการตรวจสอบและถ้าเกี่ยวข้องยอมรับ
C4stor

คำตอบ:


111

คลาส Case แตกต่างจากคลาสปกติที่ได้รับ:

  1. สนับสนุนการจับคู่รูปแบบ
  2. การใช้งานเริ่มต้นของequalsและhashCode
  3. การใช้งานเริ่มต้นของการทำให้เป็นอันดับ
  4. การใช้งานเริ่มต้นที่ดีกว่าtoStringและ
  5. จำนวนเงินที่เล็ก ๆ scala.Productของการทำงานที่พวกเขาได้รับจากการสืบทอดโดยอัตโนมัติจาก

การจับคู่รูปแบบเท่ากับและ hashCode ไม่ได้มีความสำคัญอะไรสำหรับซิงเกิลตัน (เว้นแต่คุณจะทำบางสิ่งที่เสื่อมโทรมจริงๆ) ดังนั้นคุณค่อนข้างจะได้รับการทำให้เป็นอนุกรมดีtoStringและวิธีการบางอย่างที่คุณอาจไม่เคยใช้


46
จุดที่ 3 และ 4 ของคำตอบนี้คือความแตกต่างที่ถูกต้องระหว่างวัตถุเคสและวัตถุ จุดที่ 1 และ 2 ไม่สำคัญสำหรับวัตถุแบบซิงเกิล และวัตถุแบบซิงเกิลนั้นเป็นผลิตภัณฑ์ที่มี arity 0 อยู่เสมอดังนั้นจุดที่ 5 ก็ไม่สำคัญเช่นกัน
Wojciech Durczyński

86
โพสต์นี้จะยืดอายุตำนานที่objectเหมือนกับซิงเกิล มันไม่ใช่. ค่อนข้างเป็นสิ่งที่มันบอกว่ามันคือวัตถุคือการประกาศและการสร้างอินสแตนซ์ในหนึ่ง สิ่งนี้ จำกัดobjectให้กับอินสแตนซ์เดียวหากกำหนดไว้ในขอบเขตของแพคเกจซึ่งทำให้เป็นผลเดี่ยว แต่ถ้ากำหนดไว้ในขอบเขตนั้น หากกำหนดไว้ในคลาสคุณสามารถมีอินสแตนซ์ได้มากเท่าคลาส (มันเป็นอินสแตนซ์ที่ขี้เกียจดังนั้นจึงไม่จำเป็นต้อง 1-1) และวัตถุภายในเหล่านั้นอาจถูกนำมาใช้เป็นปุ่มแฮชได้ดีทำให้ค่าเริ่มต้นเท่ากับ / hashCode ที่สมเหตุสมผลมาก
nilskp

66
คำถามเกี่ยวกับการcase objectไม่เรียนทำไมนี่คือคำตอบที่ถูกต้องหรือไม่
Ixx

10
นี่ไม่ได้ตอบคำถาม คำตอบนี้เกี่ยวข้องกับความแตกต่างระหว่างและcase class classคำถามที่เป็นเรื่องเกี่ยวกับความแตกต่างระหว่างและcase object object
MK

6
@ C4stor คำตอบไม่ได้พูดอย่างนั้น วัตถุไม่ได้เป็นคลาส เนื่องจากคลาสของเคสนั้นมีเวทย์มนตร์อยู่เบื้องหลังพอสมควรจากกรณีและความยุ่งยากต่าง ๆ ของสกาล่าทำให้ไม่มีเหตุผลที่จะคิดว่าความแตกต่างเพียงอย่างเดียวระหว่างวัตถุสกาล่ามาตรฐานกับวัตถุเคสอธิบายโดยสิ่งที่เรารู้เกี่ยวกับความแตกต่าง ระหว่างคลาสมาตรฐานและคลาสเคส คำตอบนี้ไม่ได้อยู่ที่ถ้อยคำของคำถาม
2560

137

นี่คือความแตกต่างหนึ่งเดียว - กรณีของวัตถุขยายคุณสมบัติ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$

15
ผมคิดว่ากรณีที่วัตถุสามารถต่อเนื่องคือความแตกต่างมากที่สุดจากวัตถุปกติโดยเฉพาะในเครือข่ายการสื่อสารระหว่างนักแสดง
爱国者

14
การเพิ่มextends Serializableควรทำเช่นเดียวกัน
nilskp

36
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


2

กรณีวัตถุโดยนัยมาพร้อมกับการใช้งานของวิธีการ toString เท่ากับและ hashCode แต่วัตถุที่เรียบง่ายไม่ได้ วัตถุเคสสามารถทำเป็นอนุกรมได้ในขณะที่วัตถุธรรมดาไม่สามารถทำได้ซึ่งทำให้วัตถุเคสมีประโยชน์มากเช่นเดียวกับข้อความที่มี Akka-Remote การเพิ่มคีย์เวิร์ด case ก่อนอ็อบเจ็กต์คีย์เวิร์ดทำให้อ็อบเจ็กต์เป็นอนุกรม


0

คล้ายกับcase classและclassเราเพิ่งใช้case objectแทนcase classเมื่อไม่มีฟิลด์ใด ๆ ที่แสดงข้อมูลสถานะเพิ่มเติม


0

เรารู้จักวัตถุและ "case class" มาก่อน แต่ "case object" เป็นการผสมกันของทั้งสองอย่างนั่นคือ singleton คล้ายกับวัตถุและมีสำเร็จรูปจำนวนมากในคลาส case ความแตกต่างเพียงอย่างเดียวคือสร้างสำเร็จรูปสำหรับวัตถุแทนที่จะเป็นคลาส

วัตถุกรณีจะไม่มาพร้อมกับวัตถุด้านล่าง:

ใช้วิธียกเลิกการใช้ ที่นี่ไม่มีวิธีการคัดลอกเนื่องจากนี่เป็นซิงเกิลตัน ไม่มีวิธีการเปรียบเทียบความเท่าเทียมกันของโครงสร้าง ไม่มีตัวสร้างเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.