Я не можу зрозуміти сенс 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 ? Чи це єдина причина такого вибору дизайну?