2009-10-05 10 views
12

Примечание: От Scala 2.11, NotNull устарел.Поддержка библиотек NotNull от Scala

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

Что недоставало, достойная поддержка библиотеки для типов, не допускающих нулевое значение. Если я хотел бы написать пакет, который не должен напрямую связываться с 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._ 

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

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

+1

Вы можете расширить строку? Я думал, что это было окончательно. –

+0

На самом деле вы не можете. Хорошая точка зрения. Нужно определить NString с неявным преобразованием в строку, я думаю. –

+1

Я предполагаю, что вы ищете что-то вроде 'org.jetbrains.nnotes.NotNull' - и я тоже это пропустил. – Martin

ответ

9

Я действительно не знаю, что такое сделка с 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()) 

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

Так что я не ответил на ваш вопрос на всех, но я передать это в случае, если это полезно ...

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

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

Проблема с вашим подходом заключается в том, что система типов не заставляет меня не использовать null. Поэтому я могу забыть Java API-вызов и иметь нулевое прошивание в моем коде, не заметив. Если OTOH все типы NotNullable, компилятор будет кричать, если вы сделали val x: String с NotNullable = javaapithatmightreturnNull(). –

+5

'Option.apply' выполняет те же функции, что и ваша функция'? '. – schmmd

+2

Действительно, но это было написано до Option.apply. – Lachlan