Поддержка библиотеки для 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.
Есть ли возможность легко заставить многие полезные типы в стандартной библиотеке быть непустыми?
Ответы
Ответ 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())