Допустим, у меня есть следующая черта
trait Named {
def name: String
}
и следующий алгебраический тип данных
sealed trait Animal extends Named
case object Dog extends Animal {
override val name: String = "dog man"
}
case object Cat extends Animal {
override val name: String = "cat man"
}
case object Owl extends Animal {
override val name: String = "I am an owl left in the dark"
}
Теперь я могу десериализовать экземпляр строки в свой Animal ADT с помощью следующего метода.
object Animal {
def apply(name: String): Animal = name match {
case Dog.name => Dog
case Cat.name => Cat
}
}
@oxbow_lakes упоминает в конце своего ответа, что:
Невозможно легко создать экземпляр из сохраненного значения. Это также верно, но, за исключением случая огромных перечислений (например, всех валют), это не вызывает огромных накладных расходов.
Я считаю, что тот факт, что когда вы добавляете новое значение, его необходимо добавить в код десериализации явно как подверженный ошибкам (я думал, что компилятор предупредит меня о неполном совпадении, но взгляните на Owl
выше и apply
метод - предупреждения не выдавалось ...)
Нет лучшего способа? (Если не со стандартным набором инструментов scala, сторонним?)