Nie jestem w stanie zrozumieć sensu Option[T]zajęć w Scali. To znaczy, nie jestem w stanie dostrzec żadnych zalet Noneponad 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 getPerson1zwraca null, a następnie wywołanie displayw pierwszym wierszu programu mainnie powiedzie się NPE. Podobnie, jeśli getPerson2zwróci None, displaywywoł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 nulllub Nonew 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?