Apakah ada perbedaan antara objek case dan objek dalam scala?
case
untuk memiliki pola yang cocok, itu hanya gula. Menerapkan unapply
diri Anda melakukan pekerjaan.
Apakah ada perbedaan antara objek case dan objek dalam scala?
case
untuk memiliki pola yang cocok, itu hanya gula. Menerapkan unapply
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.
object
sama dengan singleton. Bukan itu. Melainkan persis seperti yang dikatakannya, sebuah objek, yaitu deklarasi dan instantiasi dalam objek. Ini terbatas object
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 a class
. Pertanyaannya adalah tentang perbedaan antara case object
dan object
.
Inilah satu perbedaan - objek kasing memperluas Serializable
sifat, 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$
extends Serializable
harus melakukan trik yang sama.
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
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.
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.