Подтвердить что ты не робот

Поддержка библиотеки для Scala NotNull trait

Примечание: Как и в случае с Scala 2.11, NotNull устарел.

Насколько я понимаю, если вы хотите, чтобы ссылочный тип не был нулевым, вам нужно смешать магическую черту NotNull, и компилятор автоматически помешает вам помещать в нее null -able значения. См. поток списка рассылки, например.

То, что не хватает, - это достойная поддержка библиотеки для типов с нулевыми значениями. Если я хотел бы написать пакет, который не обязательно должен напрямую связывать Java-код, и я хочу, чтобы по умолчанию все типы в этом пакете не использовали null, у меня нет выбора, кроме как переопределить все переменные builting, например, так

//can't actually do that, but just to give the general idea
class NString extends String with NotNull
class NMap[X,Y] extends Map[X,Y] with NotNull
...

Я ожидаю, что Scala будет иметь (как плагин компилятора или библиотеку) вариант для меня написать

import collections.notnull._

чтобы легко запретить использование null в конкретном файле Scala.

Есть ли возможность легко заставить многие полезные типы в стандартной библиотеке быть непустыми?

4b9b3361

Ответ 1

Я действительно не знаю, что такое сделка с NotNull, но создается впечатление, что Scala не полностью разработал, как он хочет иметь дело с понятиями NotNull/Nullable. Моя собственная политика - никогда не использовать null в Scala, и если вы вызываете Java API, который может возвращать null, немедленно преобразует его в Option.

Этот метод утилиты - мой лучший друг:

def ?[A <: AnyRef](nullable: A): Option[A] = if (nullable eq null) None else Some(nullable)

Затем вы делаете такие вещи:

val foo: Option[Foo] = ?(getFooFromJavaAPIThatMightReturnNull())

Я нахожу это намного проще, чем пытаться отслеживать, что может быть или не быть нулевым.

Итак, я вообще не ответил на ваш вопрос, но я передаю это, если это полезно...

Обновить: более современные версии Scala теперь поддерживают это в стандартном API:

val foo: Option[Foo] = Option(getFooFromJavaAPIThatMightReturnNull())