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:
dukungan pencocokan pola
implementasi standar dari equalsdanhashCode
implementasi serialisasi standar
implementasi standar yang lebih cantik dari toString, dan
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.
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>caseobject B
defined module B
scala>import java.io._
import java.io._
scala>val bos =newByteArrayOutputStream
bos: java.io.ByteArrayOutputStream=
scala>val oos =newObjectOutputStream(bos)
oos: java.io.ObjectOutputStream= java.io.ObjectOutputStream@e7da60
scala> oos.writeObject(B)
scala> oos.writeObject(A)
java.io.NotSerializableException: A$
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.
Ini mirip dengan case classdan class, kami hanya menggunakan case objectalih-alih case classketika tidak ada bidang yang mewakili informasi status tambahan.
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.
case
untuk memiliki pola yang cocok, itu hanya gula. Menerapkanunapply
diri Anda melakukan pekerjaan.Jawaban:
Kelas kasus berbeda dari kelas reguler yang mereka dapatkan:
equals
danhashCode
toString
, danscala.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.sumber
object
sama dengan singleton. Bukan itu. Melainkan persis seperti yang dikatakannya, sebuah objek, yaitu deklarasi dan instantiasi dalam objek. Ini terbatasobject
pada 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.case object
bukan kelas, mengapa ini jawaban yang benar?case class
dan aclass
. Pertanyaannya adalah tentang perbedaan antaracase object
danobject
.Inilah satu perbedaan - objek kasing memperluas
Serializable
sifat, sehingga dapat diserialisasi. Objek biasa tidak dapat secara default:sumber
extends Serializable
harus melakukan trik yang sama.Perbedaan serialisasi:
Perbedaan toString:
sumber
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.
sumber
Ini mirip dengan
case class
danclass
, kami hanya menggunakancase object
alih-alihcase class
ketika tidak ada bidang yang mewakili informasi status tambahan.sumber
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.
sumber