Более идиоматический:
case class Name private (name: String) {
lazy val first :: last :: Nil = name.split(" ").toList
}
object Name {
def fromString (name: String): Either[String, Name] = {
if (name.trim.isEmpty || name.trim.length < 3) Left("Invalid name")
else Right(new Name(name.trim))
}
}
Или, может быть, такой:
case class Name (first: String, last: String) {
lazy val fullName = s"$first $last"
}
object Name {
def fromString (name: String): Either[String, Name] = {
if (name.trim.isEmpty || name.trim.length < 3) Left("Invalid name")
else {
val first :: last :: Nil = name.split(" ").toList
Right(new Name(first, last))
}
}
}
В Scala более идиоматично представлять случаи с помощью использования Either
, чем с помощью наследования.Если у вас есть экземпляр N
, вы не можете вызывать какие-либо функции, вам, вероятно, придется сопоставить его с шаблоном.Но такой тип, как Either
, уже поставляется с такими функциями, как map
, fold
и т. Д., С которыми легче работать.
Наличие частного конструктора помогает гарантировать, что вы можете создать только действительный Name
потому что единственный способ создать его - это метод fromString
.
НЕ использовать для этого импликации.Там нет необходимости и сделал бы только для запутанного кода.Не совсем то, для чего это значит.