2009-10-05 5 views
12

Remarque: A partir de Scala 2.11, NotNull est déprécié. Pour autant que je sache, si vous voulez qu'un type de référence soit non nul, vous devez mélanger le trait magique NotNull, et le compilateur vous empêchera automatiquement d'y mettre des valeurs-null -able. Voir ce mailing-list thread par exemple.Prise en charge de la bibliothèque pour le trait NotNull de Scala

Ce qui manque, c'est un support de bibliothèque décent pour les types non nullable. Si je veux écrire un paquet qui n'a pas besoin d'interfacer le code Java directement, et que je veux empêcher tous les types dans ce paquet d'utiliser null par défaut, je n'ai pas d'autre choix que de redéfinir toutes les variables de construction comme

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

je me attends scala d'avoir (comme un plug-in de compilateur, ou d'une bibliothèque) option pour moi d'écrire

import collections.notnull._ 

afin d'interdire l'utilisation facilement null dans un fichier scala spécifique.

Existe-t-il une option pour forcer facilement de nombreux types utiles dans la bibliothèque standard à ne pas être nullable?

+1

Vous pouvez étendre String? Je pensais que c'était marqué final. –

+0

En fait vous ne pouvez pas. Bon point. Besoin de définir NString avec une conversion implicite en chaîne, je suppose. –

+1

Je suppose que vous cherchez quelque chose comme 'org.jetbrains.annotations.NotNull' - et cela me manque aussi. – Martin

Répondre

9

Je ne sais pas vraiment quel est le problème avec NotNull, mais j'ai l'impression que Scala n'a pas complètement compris comment il veut gérer les concepts NotNull/Nullable. Ma propre politique est de ne jamais utiliser null dans Scala, et si vous appelez une API Java qui peut retourner null, immédiatement le convertir en Option.

Cette méthode utilitaire est mon meilleur ami:

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

Ensuite, vous faites des trucs comme ça:

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

Je trouve loin simplier que d'essayer de suivre ce qui peut ou ne peut pas être nulle.

Je n'ai pas répondu à votre question du tout, mais je passe ce dans le cas où il est utile ...

Mise à jour: plus récentes versions Scala prennent désormais en charge cela dans l'API standard:

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

Le problème avec votre approche est, que le système de type ne me force pas à utiliser null. Donc, je peux oublier un appel API Java, et avoir une fente nulle dans mon code sans m'en apercevoir. Si OTOH tous les types sont NotNullable, le compilateur crierait si vous avez fait val x: String avec NotNullable = javaapithatmightreturnNull(). –

+5

'Option.apply' fait la même chose que votre fonction'? '. – schmmd

+2

En effet, mais cela a été écrit avant Option.apply existé. – Lachlan

Questions connexes