Nie jestem w stanie zrozumieć sensu Option[T]
zajęć w Scali. To znaczy, nie jestem w stanie dostrzec żadnych zalet None
ponad null
.
Na przykład rozważ kod:
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 */
}
}
}
Załóżmy teraz, że metoda getPerson1
zwraca null
, a następnie wywołanie display
w pierwszym wierszu programu main
nie powiedzie się NPE
. Podobnie, jeśli getPerson2
zwróci None
, display
wywołanie ponownie zakończy się niepowodzeniem z podobnym błędem.
Jeśli tak, to dlaczego Scala komplikuje sprawę, wprowadzając nowe opakowanie wartości ( Option[T]
) zamiast stosować proste podejście używane w Javie?
AKTUALIZACJA:
Zmodyfikowałem swój kod zgodnie z sugestią @Mitcha . Nadal nie widzę żadnej szczególnej korzyści Option[T]
. Muszę przetestować wyjątkowy null
lub None
w obu przypadkach. :(
Jeśli dobrze zrozumiałem z odpowiedzi @ Michael , czy jedyną zaletą Option[T]
jest to, że wyraźnie informuje ona programistę, że ta metoda może zwrócić None ? Czy to jedyny powód takiego wyboru projektu?