Поддержка библиотеки для черты 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())