Я не можу зрозуміти сенс 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 ускладнює ситуацію, вводячи нову обгортку значень ( Option[T]
) замість того, щоб слідувати простому підходу, що використовується в Java?
ОНОВЛЕННЯ:
Я відредагував свій код згідно з пропозицією @Mitch . Я досі не можу побачити якоїсь особливої переваги Option[T]
. Мені доводиться тестувати на виняткове null
або None
в обох випадках. :(
Якщо я правильно зрозумів відповідь @ Michael , єдина перевага Option[T]
полягає в тому, що він явно повідомляє програмісту, що цей метод може повернути None ? Чи це єдина причина такого вибору дизайну?