我不能理解 Scala 中 Option[T]
类的要点。我的意思是,我不能看到任何优势的 None
超过 null
。
例如,考虑下面的代码:
object Main{
class Person(name: String, var age: int){
def display = println(name+" "+age)
}
def getPerson1: Person = {
// returns a Person instance or null
}
def getPerson2: Option[Person] = {
// returns either Some[Person] or None
}
def main(argv: Array[String]): Unit = {
val p = getPerson1
if (p!=null) p.display
getPerson2 match{
case Some(person) => person.display
case None => /* Do nothing */
}
}
}
现在假设方法 getPerson1
返回 null
,那么在 main
的第一行上对 display
进行的调用一定会因为 NPE
而失败。类似地,如果 getPerson2
返回 None
,则 display
调用将再次失败,并出现类似的错误。
如果是这样,那么为什么 Scala 要引入一个新的值包装器(Option[T]
)而不是遵循 Java 中使用的简单方法,从而使事情变得复杂呢?
更新:
我已经按照 @ Mitch的建议编辑了我的代码。我仍然不能看到 Option[T]
的任何特殊优势。我必须在这两种情况下测试异常的 null
或 None
。:(
如果我从 @ Michael 的回复中正确理解了,那么 Option[T]
的唯一优点是它显式地告诉程序员 此方法可以返回 Nothing吗?这是这个设计选择背后的唯一原因吗?