图书馆支持Scala的NotNull特性

时间:2009-10-05 21:00:34

标签: scala notnull

注意:自Scala 2.11起,NotNull已弃用。

据我了解,如果你想让引用类型不可为空,你必须混合神奇的NotNull特征,编译器会自动阻止你放置null - 值的值在里面。例如,见mailing-list thread

缺少的是对非可空类型的体面库支持。如果我想编写一个不需要直接连接java代码的软件包,并且我希望防止此软件包中的所有类型默认使用null,我别无选择,只能重新定义所有构建变量,如所以

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

以便在特定的scala文件中轻松禁止使用null

是否可以选择轻松强制标准库中的许多有用类型不可为空?

1 个答案:

答案 0 :(得分:10)

我真的不知道与NotNull的交易是什么,但我得到的印象是Scala还没有完全弄清楚它是如何处理NotNull / Nullable概念的。我自己的策略是永远不要在Scala中使用null,如果你调用可能返回null的Java API,立即将其转换为Option

这种实用方法是我最好的朋友:

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

然后你做这样的事情:

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

我发现这比试图跟踪可能为空的内容更为简单。

所以我根本没有回答你的问题,但是如果它有用的话我会通过这个问题......

更新:更新的Scala版本现在支持标准API:

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