2009-10-05 14 views
12

Uwaga: Od wersji Scala 2.11, NotNull jest przestarzała.Obsługa biblioteki dla funkcji Scala NotNull

O ile rozumiem, jeśli chcesz, aby typ referencyjny był nie-nullable, musisz zmieszać cechę magiczną NotNull, a kompilator automatycznie uniemożliwi umieszczenie w nim wartości. Zobacz na przykład: mailing-list thread.

To, czego brakuje, to przyzwoita obsługa bibliotek dla typów nieululujących. Jeśli chciałbym napisać pakiet, który nie musi bezpośrednio łączyć kodu java, i chcę zapobiec domyślnemu używaniu wszystkich typów w tym pakiecie, to nie mam innego wyjścia, jak przedefiniować wszystkie zmienne związane z budową, takie jak:

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

Spodziewam scala mieć (jako plugin kompilatora lub biblioteki) opcji dla mnie do napisania

import collections.notnull._ 

aby łatwo Disallow null wykorzystanie w określonym pliku Scala.

Czy istnieje opcja, aby łatwo wymusić użycie wielu przydatnych typów w bibliotece standardowej, aby nie były możliwe do zniesienia?

+1

Możesz przedłużyć String? Myślałem, że to jest oznaczone jako ostateczne. –

+0

Właściwie nie możesz. Słuszna uwaga. Konieczne jest zdefiniowanie NString z niejawną konwersją do łańcucha, jak sądzę. –

+1

Domyślam się, że szukasz czegoś takiego jak "org.jetbrains.annotations.NotNull" - i też tęsknię za tym. – Martin

Odpowiedz

9

Naprawdę nie wiem, co to jest umowa z NotNull, ale mam wrażenie, że Scala nie do końca opracowała sposób, w jaki chce poradzić sobie z koncepcjami NotNull/Nullable. Moja własna polityka nigdy nie używa null w Scali, a jeśli wywołasz API Java, które może zwrócić wartość null, natychmiast przekonwertuj go na Option.

metoda

Narzędzie to jest moim najlepszym przyjacielem:

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

Potem robisz rzeczy tak:

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

Uważam to znacznie prostsze niż próbuje śledzić, co może lub nie może być null.

Więc nie odpowiedzieć na to pytanie w ogóle, ale to przekazać w przypadku jest przydatna ...

Aktualizacja: nowsze wersje Scala teraz wspierać ten w standardowym API:

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

Problem z twoim podejściem polega na tym, że system typów nie zmusza mnie do nieużywania wartości NULL. Mogę więc zapomnieć wywołania interfejsu API języka Java i mieć wartość null wkradającą się w mój kod bez zauważenia. Jeśli OTOH wszystkie typy są NotNullable, kompilator krzyczy, jeśli zrobiłeś val x: String z NotNullable = javaapithatmightreturnNull(). –

+5

'Option.apply' robi to samo co twoja funkcja'? '. – schmmd

+2

Rzeczywiście, ale zostało to napisane zanim Option.apply istniało. – Lachlan

Powiązane problemy