论坛首页 Java企业应用论坛

用Scala语言中的 Option 对象来处理 null-like 返回值

浏览 6027 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-19  
   在Java里,开发人员往往是返回一个null值来表示方法调用成功,而不考虑这个返回值是否有意义. Scala,是一个面向对象的,functional 语言,它运行于JVM之上,它有一个更好的方式来处理null-like返回值: The Option class.
    Scala是一个以JVM为平台的面向对象的functional语言. 正当开发人员寻找各种能够在JVM上运行,并且相对与Java语言来说能大幅度提供开发人员的效率的语言时,Scala以一种强大的,但实验性的竞争者出现了.

技术发展的太快,不停的有新的东西出现,Scala这种语言对我来说真是很陌生,
但网上对这个语言的讨论好像慢慢越来越多,
最近有个David Pollak的写了一篇Blog是关于Scala的Option对象的,吸引了很多关注,
我浏览了一下觉得有些价值,就选取了一些关键的论点摘译了一下,供大家欣赏.

本文由 docman.cn 翻译家 提供

David Pollak, 使用the lift framework将Scala应用于企业级web开发的先锋,在他最近的一篇Blog : The Scala Option class and how lift uses it.里强调了Scala的这个很有用的语言特征.

Pollak's 介绍Scala's Option class 的出发点是在Java平台上经常碰到的使用null来表达一个方法的成功执行结果,这样一种没有意义的返回值. 例如,为了说明一个具有特定名称的用户没有找到,于是就返回 null.

也许更可取的是抛出一个异常—但这个没有找到用户的事件很难达到使用异常的条件—Java里没有对应于null的类型和方法. 一个例子,那些可以接受null返回值的代码如果没有检查是否是null值,就会容易的导致一个NullPointerExceptions.

那些把null跟系统里类型同等对待的语言,例如Ruby,能够在null值上调用nil?,是应该受到赞赏的.

根据David Pollak Blog里介绍的,Scala's Option class在这个概念上走的更远.  .

Scala上实现的有些不同.  Option.是个抽象类,它是强类型的.. 它被声明为 Option[T]. 这说明一个Option可以是任何类型,但是类型一旦被定义就不能改变.  Option 有两个子类:Some and None. None is a singleton (like nil). Some 是一个实际结果的容器. 所以你的方法应该是这样的:

 
def findUser(name: String): Option[User] = {
val query = buildQuery(name)
val resultSet = performQuery(query)
val retVal = if (resultSet.next) Some(createUser(resultSet))
else None
resultSet.close
retVal
}

Pollak 说在Scala丰富的collection's API中  Options 是一个非常有用的类, 因为:

 Option 实现了 map, flatMap, and filter 接口(这样 Scala 编译器就允许在 'for'循环里使用它了...) 这样... 你就可以非常有效的使用这个结构了. [Editor's note: The for comprehension is basically an iteration over elements of a collection, passing some code to each element.]

Pollak 在他的lift framework里展示了如何使用Options进行简单的编码:

这就意味着你的代码应该象下面的样子:

def confirmDelete {
(for (val id <- param("id"); // get the ID
val user <- User.find(id)) // find the user
yield {
user.delete_!
notice("User deleted")
redirectTo("/simple/index.html")
}) getOrElse {error("User not found"); redirectTo("/simple/index.html")}
}

这里没有显式的防止/测试这个"id"参数是否被传入,也没有显式的测试这个用户是否被找到. 如果这个id没有提供,或者是系统中没有符合这个id的用户,"else"语句就会被执行. 你可以看到这些代码是完全的类型安全的(type-safe). 尽管这里没有显式的类型声明,编译器仍然知道每个对象的类型是什么.

What do you think of Scala's Option class?

   发表时间:2007-04-20  
语法倒是很简练
0 请登录后投票
   发表时间:2007-06-06  
Scala貌似很不错,可惜作者挑错东西翻译了。开始就丢出一个陌生语言的一个小细节来,实在沟不起大家的兴趣。

挑个event-based actor或者thread actor出来,绝对能够吊起大家的胃口。

如今流行actor,看看Erlang就知道啦.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics