Я не могу понять смысл Option[T]
класса в Scala. Я имею в виду, я не вижу никаких преимуществ 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
, тогда вызов, сделанный в display
первой строке, main
обязательно завершится ошибкой NPE
. Точно так же, если getPerson2
возвращается None
, display
вызов снова завершится ошибкой с аналогичной ошибкой.
Если да, то почему Scala усложняет ситуацию, вводя новое значение wrapper ( Option[T]
) вместо того, чтобы следовать простому подходу, используемому в Java?
ОБНОВИТЬ:
Я отредактировал свой код в соответствии с предложением @Mitch . Я до сих пор не вижу особых преимуществ Option[T]
. Я должен проверить на исключительное null
или None
в обоих случаях. :(
Если я правильно понял из ответа @ Michael , единственное преимущество Option[T]
заключается в том, что он явно сообщает программисту, что этот метод может вернуть None ? Это единственная причина такого выбора дизайна?