validations in value classes

前端 未结 3 1043
孤独总比滥情好
孤独总比滥情好 2021-01-06 23:09

SIP-15 implies one can use value classes to define for example new numeric classes, such as positive numbers. Is it possible to code such a constraint that the underlying >

3条回答
  •  独厮守ぢ
    2021-01-06 23:28

    The way I have accomplished this is to use the companion object's .apply method to add a require constraint prior to calling the case class's private constructor "instantiating" the value.

    WARNING: The code below will not compile in the REPL/Scala Worksheet. A case class extending AnyVal must be a top-level class; i.e. cannot be nested within the scope of another class, trait, or object. And both the REPL and Scala Worksheet are implemented by pushing all the code into an invisible containing class before executing.

    object PositiveInt {
      def apply(value: Int): PositiveInt = {
        require(value >= 0, s"value [$value] must be greater than or equal to 0")
        new PositiveInt(value)
      }
    }
    case class PositiveInt private(value: Int) extends AnyVal
    
    val positiveTestA = PositiveInt(0)
    val positiveTestB = PositiveInt(1)
    val positiveTestC = PositiveInt(-1) //throws required exception
    

提交回复
热议问题