Запечатанный объект case против Enumeratum и проблема сериализации в scala

#scala #enums

#scala #перечисления

Вопрос:

Я узнаю о перечислениях и их предполагаемой пользе, которые на данный момент для меня не очевидны. Действительно, первое, о чем я подумал, когда увидел, что он используется, было: почему бы вместо этого не использовать алгебраический тип данных.

Затем нашел этот блог: https://pedrorijo.com/blog/scala-enums /

В следующем примере:

 sealed trait Weekday

case object Monday extends Weekday
case object Tuesday extends Weekday
case object Wednesday extends Weekday
case object Thursday extends Weekday
case object Friday extends Weekday
case object Saturday extends Weekday
case object Sunday extends Weekday
 

Но тогда

Проблемы с запечатанными объектами case…

  • не существует простого способа получить все значения перечисления
  • нет методов сериализации / десериализации по умолчанию
  • порядок по умолчанию между значениями перечисления отсутствует — этого можно добиться вручную, включив некоторую информацию о значениях…

Хотя я понимаю пункты 1 и 3, и действительно, у меня едва ли есть такие потребности, я не понимаю пункт 2

нет методов сериализации / десериализации по умолчанию

Я понимаю, что объект case сериализуем. Следовательно, я этого не понимаю?

Может кто-нибудь объяснить?

Также я действительно не вижу преимущества перед использованием алгебраического типа данных.

Комментарии:

1. Он сериализуем. У него просто нет сгенерированного метода для выполнения сериализации. Однако вы можете вручную создавать методы, используя java io stream.

Ответ №1:

нет методов сериализации / десериализации по умолчанию

Я понимаю, что объект case сериализуем. Следовательно, я этого не понимаю?

Если вы прочитаете другие примеры, вы увидите, что автор имеет в виду методы для преобразования в / из String . Конечно, toString дает вам одно направление:

 Monday.toString == "Monday"
 

Но нет способа получить значение из его имени, если вы не напишете свой собственный:

 Weekday.???("Monday") == Monday
 

Ответ №2:

В начале статьи подробно рассказывается о собственном перечислении Scala. Одним из преимуществ, показанных в собственном перечислении Scala, является сериализация / десериализация, за которой следует пример:

 scala> Weekday.Monday.toString
res0: String = Monday

scala> Weekday.withName("Monday")
res1: Weekday.Value = Monday
 

При использовании объектов case предположим, что мы имеем:

 sealed trait Weekday

case object Monday extends Weekday
 

Затем вы можете легко сериализовать:

 scala> Monday.toString
res0: String = Monday
 

Но, имея строку Monday , вернуть объект case непросто Monday .