2009-10-05 5 views
12

Avviso: A partire da Scala 2.11, NotNull obsoleto.Supporto libreria per il tratto NotNull di Scala

Per quanto ho capito, se si desidera un tipo di riferimento per essere non annullabile si devono mixin la magia NotNull tratto, e il compilatore automaticamente vi impedisce di mettere null valori -Abilitare in esso. Vedi questo mailing-list thread per esempio.

Ciò che manca è un supporto di libreria decente per tipi non annullabili. Se desidero scrivere un pacchetto che non ha bisogno di interfacciare direttamente il codice java, e voglio impedire a tutti i tipi di questo pacchetto di usare null per impostazione predefinita, non ho altra scelta che ridefinire tutte le variabili costruite come ad esempio

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

mi aspetto scala di avere (come plugin compilatore, o libreria) l'opzione per me scrivere

import collections.notnull._ 

al fine di non consentire facilmente null utilizzo in un file di scala specifica.

Esiste un'opzione per forzare facilmente molti tipi utili nella libreria standard a non rendere nulla?

+1

È possibile prolungare String? Ho pensato che fosse segnato finale. –

+0

In realtà non puoi. Buon punto È necessario definire NString con conversione implicita in stringa, suppongo. –

+1

Immagino che tu cerchi qualcosa come "org.jetbrains.annotations.NotNull' - e mi manca anche quello. – Martin

risposta

9

Non so davvero quale sia l'accordo con NotNull, ma ho l'impressione che Scala non abbia pienamente capito come vuole gestire i concetti NotNull/Nullable. La mia politica è quella di non utilizzare mai null in Scala e se si chiama un'API Java che può restituire null, immediatamente convertirlo in un Option.

metodo

Questa utility è il mio migliore amico:

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

poi si fa cose come questa:

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

Trovo che questo sia di gran lunga più semplice che cercare di tenere traccia di ciò che può o non può essere null.

Quindi non ho risposto alla tua domanda a tutti, ma mi passa questo su nel caso in cui è utile ...

Aggiornamento: le versioni più recenti Scala ora supportano questa nel API standard:

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

Il problema con il tuo approccio è che il sistema di tipi non mi obbliga a non usare null. Quindi posso dimenticare una chiamata API Java, e avere un nullo nascosto nel mio codice senza accorgertene. Se OTOH tutti i tipi sono NotNullable, il compilatore urlerebbe se hai fatto val x: String con NotNullable = javaapithatmightreturnNull(). –

+5

'Option.apply' fa le stesse cose della funzione'? '. – schmmd

+2

In effetti, ma questo è stato scritto prima che Option.apply esistesse. – Lachlan