清单 3. Scala 中的等效类
class Person(val name: String, var age: Int) {
override def toString = name + " is " + age + " years old."
}
|
清单 3 中的 Person 类浓缩成了一个可变的 age 属性、一个不可变的 name 属性,以及一个包含两个参数的构造函数,还有我改写的 toString() 方法。很容易看到这个类的独特之处,因为有趣的部分没有埋藏在语法中。 Scala 的设计强调了以最少的语法创建代码的能力,它使许多语法成为可选语法。清单 4 中的简单类演示了一个将字符串更改为大写字母的 Verbose 类: 清单 4. Verbose 类
class UpperVerbose {
def upper(strings: String*) : Seq[String] = {
strings.map((s:String) => s.toUpperCase())
}
}
|
清单 4 中的许多代码都是可选的。清单 5 给出了相同的代码,现在使用了一个 object 而不是class : 清单 5. 一个转换为大写的更简单的对象
object Up {
def upper(strings: String*) = strings.map(_.toUpperCase())
}
|
对于等效于 Java 静态方法的 Scala 代码,可创建一个 object (与独体实例等效的 Scala 内置实体)而不是一个类。方法的返回类型、用于将单行方法主体分开的括号,以及 清单 4 中无用的 s 参数都从 清单 5 中消失了。Scala 中的这种 “可折叠语法” 有利有弊。使用可折叠语法,能够以非常符合语言习惯的方式编写代码,但这让不熟悉的人难以理解您的代码。 case 类 用作数据持有者的简单类在面向对象的系统中很常见,尤其是必须与不同系统通信的系统。这种类型的类的流行使得 Scala 项目向前推进了一步,创造了 case 类。case 类自动提供了多种便捷的语法: - 可根据该类的名称创建一个工厂方法。例如,可以在不使用
new 关键字的情况下构造一个新实例:val bob = Person("Bob", 42) 。 - 该类的参数列表中的所有参数都自动
val ,也就是说,它们是作为不可变的内部字段来维护的。 - 编译器为您的类生成合理的默认
equals() 、hashCode() 和 toString() 方法。 - 编译器将一个
copy() 方法添加到类中,以便您可返回某个副本来执行变体式更改。
Java 下一代语言不仅修复了语法瑕疵,还促进了对现代软件工作原理的更准确的理解,朝这个方向塑造它们的工具。 Groovy 的自动生成属性 在 Java 下一代语言中,Groovy 与 Java 语法最接近,为常见情形提供了称为 “语法糖 (syntactic-sugar)” 的代码生成方法。参见清单 6 中简单的 Groovy Person 类:
|