Когда я работаю над моделью проекта, я разрываю между двумя разными способами указания параметра типа List
должен быть nonEmpty
. Я начал с использования List[Int]
с сопроводительным оператором require
, чтобы проверить, что List
есть nonEmpty
.
case class A(name: String, favoriteNumbers: List[Int]) {
require(favoriteNumbers.nonEmpty, "favoriteNumbers must not be empty")
}
Затем мне нужно было сделать список опционным. Если указан List
, он должен быть nonEmpty
. Я использую Option[List[Int]]
с сопроводительным оператором require
для проверки, если Option
является nonEmpty
, список также должен быть nonEmpty
.
case class B(name: String, favoriteNumbers: Option[List[Int]]) {
require(
favoriteNumbers.isEmpty || favoriateNumbers.get.nonEmpty
, "when defined, favoriteNumbers.get must be nonEmpty"
)
}
Однако мне нужно использовать этот непустой List
всю систему, которую я моделирую. Это означает, что мой код имеет те же самые require
утверждения, которые дублируются повсюду. Есть ли способ (не-ScalaZ) иметь новый тип, скажем NeList
, который определен и ведет себя идентично List, при этом единственным изменением является исключение, когда NeList
пытается создать экземпляр без элементов?
Я попробовал Google для этого и не смог найти набор условий поиска, чтобы отточить эту область. Я либо получил очень простые List
инструкции, либо всевозможные ссылки на ScalaZ NEL (Non Empty List). Итак, если есть связь, которая поможет с этим, я бы с удовольствием это увидел.