How to check constructor arguments and throw an exception or make an assertion in a default constructor in Scala?

前端 未结 2 1823
抹茶落季
抹茶落季 2020-12-05 22:20

I would like to check constructor arguments and refuse to construct throwing IllegalArgumentException in case the arguments set is not valid (the values don\'t

相关标签:
2条回答
  • 2020-12-05 23:09

    In Scala, the whole body of the class is your primary constructor, so you can add your validation logic there.

    scala> class Foo(val i: Int) {
         |   if(i < 0) 
         |     throw new IllegalArgumentException("the number must be non-negative.")
         | }
    defined class Foo
    
    scala> new Foo(3)
    res106: Foo = Foo@3bfdb2
    
    scala> new Foo(-3)
    java.lang.IllegalArgumentException: the number must be positive.
    

    Scala provides a utility method require that lets you write the same thing more concisely as follows:

    class Foo(val i: Int) {
      require(i >= 0, "the number must be non-negative.")
    }
    

    A better approach might be to provide a factory method that gives a scalaz.Validation[String, Foo] instead of throwing an exception. (Note: requires Scalaz)

    scala> :paste
    // Entering paste mode (ctrl-D to finish)
    
    class Foo private(val i: Int)
    
    object Foo {
      def apply(i: Int) = {
        if(i < 0)
          failure("number must be non-negative.")
        else
          success(new Foo(i))
      }
    }
    
    // Exiting paste mode, now interpreting.
    
    defined class Foo
    defined module Foo
    
    scala> Foo(3)
    res108: scalaz.Validation[java.lang.String,Foo] = Success(Foo@114b3d5)
    
    scala> Foo(-3)
    res109: scalaz.Validation[java.lang.String,Foo] = Failure(number must be non-negative.)
    
    0 讨论(0)
  • 2020-12-05 23:12
    scala> class Foo(arg: Int) {
         |   require (arg == 0)
         | }
    defined class Foo
    
    scala> new Foo(0)
    res24: Foo = Foo@61ecb73c
    
    scala> new Foo(1)
    java.lang.IllegalArgumentException: requirement failed
    
    0 讨论(0)
提交回复
热议问题