何时在Scala中使用Option以及何时不使用

时间:2015-11-26 12:38:41

标签: scala null optional

所以让我说我有一些课:

case class Product(id: Int, name: String)

如果我正在与某些Java API接口,并且这些值中的任何一个为null的可能性,那么我可以写一下:

case class Product(id: Option[Int], name: Option[String])

如果我没有与任何有空值作为概念的东西接口那么只要坚持第一个实现就没关系了吗? 这看起来有点烦人,因为我不得不编写单元测试来测试这些东西......

我们非常感谢您的想法。

2 个答案:

答案 0 :(得分:10)

何时使用Option的问题应该更多地与值相关的事实相关,而不是将值错误地设置为null。

澄清一下,如果您担心某个库的用户可能会将idname字段设置为null,那么您应该在两个版本中检查它。确实Option本身并没有给你任何保证。

此外,使用选项,其中某个值不是真正可选的,实际上是误导性的。

我通常只使用Option来明确声明某个值可能不存在且是有效状态。

在与Java交互时,我采用以下两种策略,具体取决于我是提供API还是使用它:

  1. 如果我提供了Java代码使用的API,我使用Option,而是使用一个小的构造函数包装器来检查所有参数是否为null并抛出否则IllegalArgumentException
  2. 如果我使用用Java编写的API我执行使用Option包装所有返回的值,以便我的Scala代码可以更清晰地处理这些情况。

答案 1 :(得分:2)

您也可以使用require投掷IllegalArgumentException,例如:

case class Product(id: Int, name: String){ require(name != null, "the name cannot be null") }