Чи є різниця між об'єктом випадку та об'єктом у шкалі?
caseщоб мати відповідність шаблонів, це просто цукор. Реалізація unapplyсебе робить свою роботу.
Чи є різниця між об'єктом випадку та об'єктом у шкалі?
caseщоб мати відповідність шаблонів, це просто цукор. Реалізація unapplyсебе робить свою роботу.
Відповіді:
Класи кейсів відрізняються від звичайних занять тим, що вони отримують:
equalsтаhashCodetoStringта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" - це суміш обох, тобто є однотонним, подібним до об'єкта та з великою кількістю котельної панелі, як у випадку з корпусом. Єдина відмінність полягає в тому, що плита котла робиться для об'єкта замість класу.
об'єкти регістру не поставляться із наведеними нижче:
Застосувати, Скасувати методи. тут немає методів копіювання, оскільки це сингл. Немає методу порівняння структурної рівності. Жоден конструктор також.