#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
.