Вы получите Option
балл лучше, если заставите себя никогда, никогда не использовать get
. Это потому, что get
является эквивалентом «хорошо, отправь меня обратно на нуль-землю».
Итак, возьмите этот пример. Как бы вы назвали display
без использования get
? Вот несколько альтернатив:
getPerson2 foreach (_.display)
for (person <- getPerson2) person.display
getPerson2 match {
case Some(person) => person.display
case _ =>
}
getPerson2.getOrElse(Person("Unknown", 0)).display
Ни одна из этих альтернатив не позволит вам позвонить display
на то, что не существует.
Что касается того, почему существует get
, Scala не говорит вам, как должен быть написан ваш код. Это может мягко подтолкнуть вас, но если вы хотите отказаться от сети безопасности, это ваш выбор.
Вы прибили это здесь:
является единственным преимуществом опции [T]
что это явно говорит
программист, что этот метод мог
вернуть нет?
За исключением "только". Но позвольте мне повторить это по-другому: main преимущество Option[T]
перед T
- это безопасность типов. Это гарантирует, что вы не будете отправлять метод T
для объекта, который может не существовать, так как компилятор не позволит вам.
Вы сказали, что должны проверять на обнуляемость в обоих случаях, но если вы забудете - или не знаете - вы должны проверить на нулевое значение, скажет ли вам компилятор? Или будут ваши пользователи?
Конечно, из-за своей совместимости с Java, Scala допускает нулевые значения так же, как и Java. Поэтому, если вы используете библиотеки Java, если вы используете плохо написанные библиотеки Scala, или если вы используете плохо написанные личные библиотеки Scala, вам все равно придется иметь дело с нулевыми указателями.
Другие два важных преимущества Option
, о которых я могу думать:
Последний вариант требует гораздо больше времени для полной оценки, и он не очень подходит для простых примеров, поскольку он показывает только свою силу в сложном коде. Итак, я приведу пример ниже, но я хорошо знаю, что он вряд ли будет что-то значить, кроме тех, кто его уже получил.
for {
person <- getUsers
email <- person.getEmail // Assuming getEmail returns Option[String]
} yield (person, email)