Apakah ada perbedaan antara objek case dan objek dalam scala?
caseuntuk memiliki pola yang cocok, itu hanya gula. Menerapkan unapplydiri Anda melakukan pekerjaan.
Apakah ada perbedaan antara objek case dan objek dalam scala?
caseuntuk memiliki pola yang cocok, itu hanya gula. Menerapkan unapplydiri Anda melakukan pekerjaan.
Jawaban:
Kelas kasus berbeda dari kelas reguler yang mereka dapatkan:
equalsdanhashCodetoString, 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.
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.
case objectbukan kelas, mengapa ini jawaban yang benar?
case classdan a class. Pertanyaannya adalah tentang perbedaan antara case objectdan object.
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$
extends Serializableharus 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.