|
Scala 中的类和 case 类
Scala 已简化了类定义,可为您自动创建存取函数、赋值函数和构造函数。例如,请查看清单 2 中的 Java 类:
清单 2. Java 中简单的 Person 类
class Person {
private String name;
private int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return name + " is " + age + " years old.";
}
}
清单 2 中惟一的非样板代码是改写的 toString() 方法。构造函数和所有方法都由 IDE 生成。相比快速生成代码,在以后轻松理解它更为重要。无用的语法增加了您在理解底层含义之前必须使用的代码量。
Scala Person 类
令人震惊的是,清单 3 中用 Scala 编写的简单 3 行定义就创建了一个等效的类:
清单 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 中的这种 “可折叠语法” 有利有弊。使用可折叠语法,能够以非常符合语言习惯的方式编写代码,但这让不熟悉的人难以理解您的代码。 |
|