2009-10-05 32 views
12

Aviso: A partir de Scala 2.11, NotNull está obsoleto.Soporte de biblioteca para el rasgo NotNull de Scala

Por lo que yo entiendo, si quieres un tipo de referencia sea no anulable que tienen que mixin la NotNull rasgo de la magia, y el compilador le impedirá automáticamente poner null valores -able en ella. Vea esto mailing-list thread por ejemplo.

Lo que falta es un soporte de biblioteca decente para tipos que no admiten nulos. Si me gustaría escribir un paquete que no necesita interconectar código java directamente, y quiero evitar que todos los tipos en este paquete utilicen null de manera predeterminada, no tengo más remedio que redefinir todas las variables de compilación como

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

que esperar a Scala tiene (como plugin del compilador, o biblioteca) opción para mí escribir

import collections.notnull._ 

con el fin de no permitir fácilmente null uso en un archivo específico Scala.

¿Existe una opción para forzar fácilmente a muchos tipos útiles en la biblioteca estándar para que no sean anulables?

+1

Puede extender String? Pensé que estaba marcado como final. –

+0

En realidad no puedes. Buen punto. Necesito definir NString con conversión implícita a cadena, supongo. –

+1

Supongo que buscas algo como 'org.jetbrains.annotations.NotNull' - y yo también echo de menos eso. – Martin

Respuesta

9

Realmente no sé cuál es el problema con NotNull, pero me da la impresión de que Scala no ha resuelto completamente cómo quiere lidiar con los conceptos NotNull/Nullable. Mi propia política es nunca usar null en Scala, y si llamas a una API Java que puede devolver nulo, inmediatamente conviértelo a Option.

método

Esta utilidad es mi mejor amigo:

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

Entonces haces cosas como esta:

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

Me parece mucho más simple que tratar de realizar un seguimiento de lo que puede o no puede ser nulo.

Así que no responder a su pregunta en absoluto, pero me pase esto en caso de que sea útil ...

actualización: Las versiones más recientes Scala ahora son compatibles con esto en el API estándar:

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

El problema con su enfoque es que el sistema de tipo no me obliga a no utilizar nulo. Así que puedo olvidarme de una llamada a la API de Java y tener un nulo escondido en mi código sin darme cuenta. Si OTOH todos los tipos son No Bloqueables, el compilador gritaría si hiciera val x: Cadena con NotNullable = javaapithatmightreturnNull(). –

+5

'Option.apply' hace las mismas cosas que su función'? '. – schmmd

+2

De hecho, pero esto fue escrito antes de que Option.apply existiera. – Lachlan

Cuestiones relacionadas