Scala优缺点

优点

兼容 Java: 这点很明显(其他 200 多种 JVM 上的语言也兼容 Java),但它是如此重要的一个功能,因此不可小视。它意味着 Scala 可以使用所有 Java 库和框架爱。这也是对那些投资该技术的人员和公司的表达敬意。

联合编译(Joint Compilation): 这表示与 Groovy 类似,Scala 类被编译为 Java 类,因此可以在 Java 项目中使用(甚至在他们被定义的同一项目中的 java 类 使用)。即使你的团队觉得完全转向 Scala,对于通过 JSR 223 整合动态语言,这依然很有用。

类型推断(Type Inference): 如果编译器能猜到类型(通常它可以做到),你就不必告诉它。这使得 Scala 代码具有动态语言的简洁性,而同时保持类型安全。

隐式转换(Implicit conversion): 使 Scala 具有类型安全性,正如扩展方法(extension method)之于 C#,开放类(open class)之于 ruby。即:向你未曾定义的类型添加方法(如字符串、列表、整数)。这是使得 Scala 符合 DSL(特定领域语言)模型的特性之一。

鼓励使用对象不变性,并且容易实现: Scala 甚至提供了内置的不变对象垃圾收集器。对于 Scala 有这样一种说法:“每当提到不变性时,有人就会开始担心性能的问题,对于某些情况,这种担忧并非毫无来由,但对于 Scala,最终结果却与这一担忧相反。不可变的数据结构相对于可变的数据结构,更有助于获得较高的效率。其原因之一在于强大的垃圾收集器(garbage collector),与 JVM 中的垃圾收集器类似。”

自动生成 Getter 和 Setter: 如果你不需要(比如你只需 Setter),你必须显示地将他们私有化(private)。这不是问题,因为通常情况都需要。

Scala 具有第一等级(first-order)函数并通过 iterable trait 实现了枚举协议(enumeration protocol),这有助于让代码更加干净、更加简洁,并能够带来其他一些好处。

Actor 编程模式让高度并行应用程序的开发更加简单。

不必显示抓取或抛出(try-catch)异常。可以认为使用已检查异常(checked exception)的害处多于好处。

缺点

刚刚起步的 IDE 支持。正如 Lift 的作者所言,Scala 的 IDE 支持,虽然进行了很多开发,还没有做到 Java 那种地步。重构支持、代码完整以及单元测试整合都很差。更不必说大多数框架支持工具不能很好地与 Scala 兼容。由于 IDE 能够帮助人们学习这种语言,这可能吓退那些新手。另一方面,Martin Folwer 认为这种 IDE 状况是相对的,一种让你更具生产力的语言足以弥补缺乏高级工具的弱点。

大多数 IDE 不支持联合编译。同样,当 Scala 更加普及之后,这一点会有所改变。类的不变性并非真的不变性,因为引用对象自身可能不是不变的。并且目前没有方法可以确保整个对象图谱是不变的。

让 JSR 223 完美地兼容 Scala 非常困难。但另一方面,取得足够好的兼容还是相当容易的。

Scala 不支持元编程(metaprogramming)。通过将其与动态语言结合,如 Ruby,可以绕过这个问题,但如果你是元编程的重度使用者,使用一个完全不同的语言是一种较好的解决办法(Fan 是另一个运行在 JVM 上的静态类型语言,与 Scala 类似,但支持元编程)。

使用 Java 资源的框架,如客户端 GWT,不能很好地兼容 Scala(虽然有人已经在服务器端让 Scala 与 GWT 兼容)。不过,有一个项目正在进行,将能够使 Scala 转化为 Java 资源。

语法和某些概念与 Java 有点不同,比如:颠倒的类型声明顺序、使用下划线而不是通配符、星号和缺省值,太多种类的空概念(nothing)、没有静态方法(你需要使用单例对象 singleton object 作为替代)。文档对这些问题有很好的解释,但是,请留意,这不是 Java 代码到 Scala 代码的自动转换。