Perbedaan antara objek kasus dan objek


226

Apakah ada perbedaan antara objek case dan objek dalam scala?


3
Dia memiliki poin - tidak perlu memiliki objek kasus untuk dapat mencocokkan pola di atasnya. Saya pikir ini tidak dibahas dalam pertanyaan sebelumnya ...
axel22

3
Saya pikir akan ada perbedaan dalam perilaku pencocokan pola tetapi objek kasus dan objek normal berperilaku dengan cara yang sama dalam pencocokan pola AFAIK. Sangat sulit untuk menemukan informasi sama sekali tentang objek kasus jadi saya menantikan seseorang yang memberi kita pencerahan.
Umur Mooij

4
Tidak perlu digunakan caseuntuk memiliki pola yang cocok, itu hanya gula. Menerapkan unapplydiri Anda melakukan pekerjaan.
Raphael

1
Jawaban yang diterima tidak menjawab pertanyaan, seperti yang dibahas dalam komentar di atasnya. Terlambat untuk membuat perbedaan, tetapi harus diperhatikan.
kuncinya

Belum terlambat untuk mengedit jawaban yang diterima. Hasil edit akan ditinjau dan jika relevan, diterima.
C4stor

Jawaban:


111

Kelas kasus berbeda dari kelas reguler yang mereka dapatkan:

  1. dukungan pencocokan pola
  2. implementasi standar dari equalsdanhashCode
  3. implementasi serialisasi standar
  4. implementasi standar yang lebih cantik dari toString, dan
  5. sejumlah kecil fungsionalitas yang mereka peroleh secara otomatis dari scala.Product.

Pencocokan pola, persamaan dan kode hash tidak terlalu menjadi masalah bagi lajang (kecuali jika Anda melakukan sesuatu yang benar-benar merosot), jadi Anda cukup banyak mendapatkan serialisasi, bagus toString, dan beberapa metode yang mungkin tidak akan pernah Anda gunakan.


46
Poin 3 dan 4 dari jawaban ini adalah perbedaan yang benar antara objek kasus dan objek. Poin 1 dan 2 tidak masalah untuk objek tunggal. Dan objek tunggal selalu Produk dengan arity 0 sehingga poin 5 tidak masalah juga.
Wojciech Durczyński

86
Posting ini mengabadikan mitos yang objectsama dengan singleton. Bukan itu. Melainkan persis seperti yang dikatakannya, sebuah objek, yaitu deklarasi dan instantiasi dalam objek. Ini terbatas objectpada satu instance jika didefinisikan dalam lingkup paket, yang secara efektif menjadikannya singleton, tetapi hanya jika didefinisikan DALAM RUANG LINGKUP. Jika didefinisikan di dalam kelas, Anda dapat memiliki banyak instance seperti kelas itu sendiri (itu malas dipakai, jadi itu tidak selalu 1-1). Dan objek-objek bagian dalam itu dapat digunakan sebagai kunci hash, membuat default sama dengan / kode hash sangat masuk akal.
nilskp

66
Pertanyaannya adalah tentang case objectbukan kelas, mengapa ini jawaban yang benar?
Ixx

10
Ini tidak menjawab pertanyaan. Jawaban ini berkaitan dengan perbedaan antara case classdan a class. Pertanyaannya adalah tentang perbedaan antara case objectdan object.
MK

6
@ C4stor Jawabannya tidak mengatakan itu. Objek bukan kelas. Mengingat bahwa kelas kasus melakukan cukup banyak sihir di belakang layar, mengingat berbagai kasus tepi dan komplikasi Scala, tidak ada alasan untuk menganggap bahwa satu-satunya perbedaan antara objek Scala standar dan objek kasus dijelaskan oleh apa yang kita ketahui tentang perbedaan antara kelas standar dan kelas kasus. Jawaban ini bahkan tidak membahas kata-kata dari pertanyaan itu.
bruce

137

Inilah satu perbedaan - objek kasing memperluas Serializablesifat, sehingga dapat diserialisasi. Objek biasa tidak dapat secara default:

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
Saya berpikir bahwa benda kasus dapat serial adalah perbedaan yang paling dari benda-benda biasa terutama dalam komunikasi jaringan antara aktor
爱国者

14
Menambahkan extends Serializableharus melakukan trik yang sama.
nilskp

36
scala> object foo

didefinisikan objek foo

scala> case object foocase

objek didefinisikan foocase

Perbedaan serialisasi:

scala> foo.asInstanceOf[Serializable]

java.lang.ClassCastException: foo $ tidak dapat dilemparkan ke scala.Serializable
... 43 elided

scala> foocase.asInstanceOf[Serializable]

res1: Serializable = foocase

Perbedaan toString:

scala> foo

res2: foo.type = foo $ @ 7bf0bac8

scala> foocase

res3: foocase.type = foocase


2

objek kasus secara implisit disertai dengan implementasi metode toString, equals, dan hashCode, tetapi objek sederhana tidak. objek case dapat diserialisasi sementara objek sederhana tidak bisa, yang membuat objek case sangat berguna sebagai pesan dengan Akka-Remote. Menambahkan kata kunci kasus sebelum kata kunci objek membuat objek serial.


0

Ini mirip dengan case classdan class, kami hanya menggunakan case objectalih-alih case classketika tidak ada bidang yang mewakili informasi status tambahan.


0

Kita tahu objek dan "kelas kasus" sebelumnya. Tapi "case case" adalah campuran dari keduanya yaitu itu adalah singleton yang mirip dengan objek dan dengan banyak boilerplate seperti dalam kelas kasus. Satu-satunya perbedaan adalah bahwa boilerplate dilakukan untuk objek, bukan kelas.

objek kasing tidak akan datang dengan yang di bawah ini:

Terapkan, Batalkan penerapan metode. tidak ada metode penyalinan karena ini singleton. Tidak ada metode untuk perbandingan kesetaraan struktural. Tidak ada konstruktor juga.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.