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

use*_*469 2 null scala optional

所以让我说我有一些课:

case class Product(id: Int, name: String)
Run Code Online (Sandbox Code Playgroud)

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

case class Product(id: Option[Int], name: Option[String])
Run Code Online (Sandbox Code Playgroud)

如果我没有与任何有空值作为概念的东西接口,那么只需坚持第一个实现就可以了吗?这似乎有点烦人,因为我必须编写单元测试来测试这些东西......

我们将非常感谢您的想法.

niv*_*vox 10

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

为了澄清,如果你担心你的库的用户可能以某种方式将idor或name字段设置为null,你应该在两个版本中检查它.事实上,Option它本身并没有给你任何保证.

此外,使用一个选项,其中一个不是真正可选的值真的是误导.

我通常Option只使用显式声明一个值可能不存在而且是一个有效状态.

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

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