如何检查构造函数参数并抛出异常或在 Scala 的默认构造函数中进行断言? [英] How to check constructor arguments and throw an exception or make an assertion in a default constructor in Scala?

查看:36
本文介绍了如何检查构造函数参数并抛出异常或在 Scala 的默认构造函数中进行断言?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想检查构造函数参数并拒绝构造抛出 IllegalArgumentException 以防参数集无效(值不符合预期的约束).如何在 Scala 中编写代码?

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 fit in expected constraints). How to code this in Scala?

推荐答案

在 Scala 中,类的整个主体是您的主要构造函数,因此您可以在那里添加验证逻辑.

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 提供了一个实用方法 require 可以让你更简洁地编写相同的东西,如下所示:

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.")
}

更好的方法可能是提供一个工厂方法,它给出一个 scalaz.Validation[String, Foo] 而不是抛出异常.(注意:需要Scalaz)

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.)

这篇关于如何检查构造函数参数并抛出异常或在 Scala 的默认构造函数中进行断言?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆