Чи є різниця між об'єктом випадку та об'єктом у шкалі?
case
щоб мати відповідність шаблонів, це просто цукор. Реалізація unapply
себе робить свою роботу.
Чи є різниця між об'єктом випадку та об'єктом у шкалі?
case
щоб мати відповідність шаблонів, це просто цукор. Реалізація unapply
себе робить свою роботу.
Відповіді:
Класи кейсів відрізняються від звичайних занять тим, що вони отримують:
equals
таhashCode
toString
таscala.Product
. Зіставлення шаблонів, рівних і хеш-кодів для синглонів не мають великого значення (якщо ви не зробите щось по-справжньому вироджене), тому ви майже просто отримуєте серіалізацію, приємний toString
і деякі методи, які ви, ймовірно, ніколи не будете використовувати.
object
є тим самим, що й одиночний. Це не. Скоріше, це саме те, про що йдеться, це об'єкт, тобто декларація та інстанція в одному. Це обмежує object
окремий екземпляр, якщо він визначений в області пакету, що фактично робить його однократним, але тільки якщо визначено В ТОМУ ОБХІДІ. Якщо визначено всередині класу, у вас може бути стільки екземплярів, скільки і у самого класу (він ліниво створений, тому це не обов'язково 1-1). І ці внутрішні об'єкти цілком можуть бути використані як хеш-ключі, що робить значення за замовчуванням рівним / хэш-коду дуже чутливим.
case object
не класу, чому це правильна відповідь?
case class
та a class
. Питання полягає в різниці між case object
і object
.
Ось одна відмінність - регістрові об’єкти розширюють 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$
extends Serializable
має робити той самий трюк.
scala> object foo
визначений об'єкт foo
scala> case object 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
об'єкти регістру неявно поставляються з реалізацією методів toString, equals і hashCode, але прості об'єкти цього не роблять. об'єкти регістру можуть бути серіалізовані, тоді як прості об'єкти не можуть, що робить об'єкти справ дуже корисними як повідомлення з Akka-Remote. Додавання ключового слова до ключового слова об'єкта робить об'єкт серіалізаційним.
Це схоже на, case class
і class
ми просто використовуємо case object
замість того, case class
коли немає жодного поля, що представляє додаткову інформацію про стан.
Ми знаємо об'єкти та "клас класів" раніше. Але "case object" - це суміш обох, тобто є однотонним, подібним до об'єкта та з великою кількістю котельної панелі, як у випадку з корпусом. Єдина відмінність полягає в тому, що плита котла робиться для об'єкта замість класу.
об'єкти регістру не поставляться із наведеними нижче:
Застосувати, Скасувати методи. тут немає методів копіювання, оскільки це сингл. Немає методу порівняння структурної рівності. Жоден конструктор також.