Різниця між об'єктом справи та об'єктом


226

Чи є різниця між об'єктом випадку та об'єктом у шкалі?


3
У нього є пункт - не потрібно мати об'єкт справи, щоб мати змогу узгоджувати його. Я думаю, це не було вирішено в попередньому питанні ...
axel22

3
Я думав, що буде різниця в поведінці відповідності шаблону, але і об'єкт "регістр", і "нормальний" об'єкт поводяться однаково в шаблоні AFAIK. Досить важко знайти будь-яку інформацію про об'єкти справи, тому я з нетерпінням чекаю, що хтось нас просвітить.
Вік Муїй

4
Не потрібно використовувати, caseщоб мати відповідність шаблонів, це просто цукор. Реалізація unapplyсебе робить свою роботу.
Рафаель

1
Прийнята відповідь просто не відповідає на питання, про що йдеться в коментарях до нього. Шлях занадто пізно, щоб змінити значення, але це слід зазначити.
йогобрюс

Ще не пізно відредагувати прийняту відповідь. Редагування буде переглянуто і, якщо необхідно, буде прийнято.
C4stor

Відповіді:


111

Класи кейсів відрізняються від звичайних занять тим, що вони отримують:

  1. Підтримка відповідності шаблонів
  2. реалізації за замовчуванням equalsтаhashCode
  3. реалізація за замовчуванням серіалізації
  4. краща реалізація за замовчуванням toStringта
  5. невелика кількість функціональних можливостей, які вони отримують від автоматичного успадкування від scala.Product.

Зіставлення шаблонів, рівних і хеш-кодів для синглонів не мають великого значення (якщо ви не зробите щось по-справжньому вироджене), тому ви майже просто отримуєте серіалізацію, приємний toStringі деякі методи, які ви, ймовірно, ніколи не будете використовувати.


46
Пункти 3 та 4 цієї відповіді - правильна різниця між об'єктами справи та об'єктами. Точки 1 і 2 не мають значення для однотонних об'єктів. І одиночні об'єкти - це завжди продукти з атрибутом 0, тому точка 5 теж не має значення.
Войцех Дурчинський

86
Ця публікація увічнює міф, який objectє тим самим, що й одиночний. Це не. Скоріше, це саме те, про що йдеться, це об'єкт, тобто декларація та інстанція в одному. Це обмежує objectокремий екземпляр, якщо він визначений в області пакету, що фактично робить його однократним, але тільки якщо визначено В ТОМУ ОБХІДІ. Якщо визначено всередині класу, у вас може бути стільки екземплярів, скільки і у самого класу (він ліниво створений, тому це не обов'язково 1-1). І ці внутрішні об'єкти цілком можуть бути використані як хеш-ключі, що робить значення за замовчуванням рівним / хэш-коду дуже чутливим.
nilskp

66
Питання стосується case objectне класу, чому це правильна відповідь?
Ixx

10
Це не дає відповіді на запитання. Ця відповідь стосується різниці між case classта a class. Питання полягає в різниці між case objectі object.
МК

6
@ C4stor Однак відповідь не говорить про це. Об'єкт - не клас. Зважаючи на те, що класи випадків роблять неабияку магію за кадром, враховуючи різні кращі випадки та ускладнення Скали, немає причин просто припускати, що єдина різниця між стандартним об'єктом Scala та об'єктом case пояснюється тим, що ми знаємо про різницю між стандартними класами і класами кейсів. Ця відповідь навіть не стосується формулювання питання.
йогобрюс

137

Ось одна відмінність - регістрові об’єкти розширюють 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$

15
Я думаю, що об'єкти випадку можна серіалізувати - це найбільша відмінність від звичайних об'єктів, особливо в мережевому спілкуванні між учасниками
爱国者

14
Додавання extends Serializableмає робити той самий трюк.
nilskp

36
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


2

об'єкти регістру неявно поставляються з реалізацією методів toString, equals і hashCode, але прості об'єкти цього не роблять. об'єкти регістру можуть бути серіалізовані, тоді як прості об'єкти не можуть, що робить об'єкти справ дуже корисними як повідомлення з Akka-Remote. Додавання ключового слова до ключового слова об'єкта робить об'єкт серіалізаційним.


0

Це схоже на, case classі classми просто використовуємо case objectзамість того, case classколи немає жодного поля, що представляє додаткову інформацію про стан.


0

Ми знаємо об'єкти та "клас класів" раніше. Але "case object" - це суміш обох, тобто є однотонним, подібним до об'єкта та з великою кількістю котельної панелі, як у випадку з корпусом. Єдина відмінність полягає в тому, що плита котла робиться для об'єкта замість класу.

об'єкти регістру не поставляться із наведеними нижче:

Застосувати, Скасувати методи. тут немає методів копіювання, оскільки це сингл. Немає методу порівняння структурної рівності. Жоден конструктор також.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.