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

Примечание. Начиная с версии Scala 2.11, NotNull устарела.

Насколько я понимаю, если вы хотите, чтобы ссылочный тип не обнулялся, вы должны смешать магию NotNull черта, и компилятор автоматически помешает вам поставить nullВозможные значения в нем. Посмотрите эту ветку списка рассылки, например.

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

//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.

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

1 ответ

Решение

Я действительно не знаю, с чем дело NotNull, но у меня складывается впечатление, что Scala не до конца выяснила, как она хочет работать с концепциями NotNull/Nullable. Моя собственная политика состоит в том, чтобы никогда не использовать нуль в Scala, и если вы вызываете Java API, который может возвращать ноль, немедленно преобразуйте его в 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())
Другие вопросы по тегам