Scala - 辅助构造函数
Scala 中的构造函数是一种特殊的方法,用于初始化对象。Scala 有两种构造函数:主构造函数和辅助构造函数。通过构造函数,你可以为字段设置初始值,并在创建对象时执行所需的任何设置。本章解释了如何在 Scala 编程中使用构造函数。
辅助构造函数
辅助构造函数是在类体中使用 this 关键字定义的额外构造函数。它们提供了创建类实例的替代方式。因此,比仅使用主构造函数提供了更多的灵活性。
辅助构造函数是类中的额外构造函数。它使用 this 关键字定义。你必须在同一类中调用另一个构造函数(要么是主构造函数,要么是另一个辅助构造函数)。
语法
class ClassName(parameter1: Type, parameter2: Type) {
// 主构造函数
def this(parameter1: Type) {
this(parameter1, defaultValue)
// 额外的初始化
}
// 类体
}
示例
以下示例展示了 Scala 编程中的一个简单的辅助构造函数。
class Rectangle(val width: Int, val height: Int) {
var area: Int = width * height
// 辅助构造函数
def this(side: Int) = {
this(side, side)
}
override def toString: String = s"Rectangle(width: $width, height: $height, area: $area)"
}
object Demo {
def main(args: Array[String]): Unit = {
val rectangle1 = new Rectangle(10, 20)
val rectangle2 = new Rectangle(15)
println(rectangle1)
println(rectangle2)
}
}
将上述程序保存为 Demo.scala。以下命令用于编译和执行该程序。
命令
> scalac Demo.scala > scala Demo
输出
Rectangle(width: 10, height: 20, area: 200) Rectangle(width: 15, height: 15, area: 225)
在示例中,Rectangle 类有一个主构造函数和一个辅助构造函数。辅助构造函数仅使用一个边长创建一个正方形。Demo 对象使用两种构造函数创建 Rectangle 类的实例。
链式辅助构造函数
辅助构造函数可以调用同一类中的其他辅助构造函数。这会创建一个构造函数调用的链条。这种方式提供了多种初始化对象的方法,每种方法都建立在前一种方法的基础上。
语法
class ClassName(parameter1: Type) {
// Primary constructor
def this(parameter1: Type, parameter2: Type) {
this(parameter1)
// Additional initialization
}
def this(parameter1: Type, parameter2: Type, parameter3: Type) {
this(parameter1, parameter2)
// Additional initialization
}
}
示例
以下示例展示了 Scala 编程中的链式辅助构造函数。
class Book(val title: String, val author: String, val year: Int) {
var edition: Int = 1
// Auxiliary constructor
def this(title: String, author: String) = {
this(title, author, -1)
}
// Auxiliary constructor
def this(title: String) = {
this(title, "Unknown Author")
}
override def toString: String = s"Book(title: $title, author: $author, year: $year, edition: $edition)"
}
object Demo {
def main(args: Array[String]): Unit = {
val book1 = new Book("1984", "George Orwell", 1949)
val book2 = new Book("To Kill a Mockingbird", "Harper Lee")
val book3 = new Book("Unknown Title")
println(book1)
println(book2)
println(book3)
}
}
将上述程序保存为 Demo.scala。使用以下命令来编译和执行该程序。
命令
> scalac Demo.scala > scala Demo
输出
Book(title: 1984, author: George Orwell, year: 1949, edition: 1) Book(title: To Kill a Mockingbird, author: Harper Lee, year: -1, edition: 1) Book(title: Unknown Title, author: Unknown Author, year: -1, edition: 1)
在示例中,Book class 有一个 primary constructor 和两个 auxiliary constructors。辅助构造函数提供了使用较少细节创建 Book 对象的方式。Demo object 使用这些构造函数创建了 Book class 的实例。
带默认参数的辅助构造函数
辅助构造函数可以与默认参数结合使用,为对象创建提供更大的灵活性。
语法
class ClassName(parameter1: Type, parameter2: Type = defaultValue) {
// Primary constructor
def this(parameter1: Type) {
this(parameter1, defaultValue)
// Additional initialization
}
}
示例
以下示例展示了带默认参数的辅助构造函数。
class Person(val name: String, val age: Int = 0) {
var gender: String = "Unknown"
// Auxiliary constructor
def this(name: String, age: Int, gender: String) = {
this(name, age)
this.gender = gender
}
override def toString: String = s"Person(name: $name, age: $age, gender: $gender)"
}
object Demo {
def main(args: Array[String]): Unit = {
val person1 = new Person("Alice", 30, "Female")
val person2 = new Person("Bob", 25)
val person3 = new Person("Charlie")
println(person1)
println(person2)
println(person3)
}
}
将上述程序保存为 Demo.scala。使用以下命令来编译和执行该程序。
命令
> scalac Demo.scala > scala Demo
输出
Person(name: Alice, age: 30, gender: Female) Person(name: Bob, age: 25, gender: Unknown) Person(name: Charlie, age: 0, gender: Unknown)
在示例中,Person class 有一个带有默认参数的 primary constructor。它还有一个 auxiliary constructor,该构造函数添加了更多参数。Demo object 使用这些构造函数创建了 Person class 的实例。
Scala 辅助构造函数总结
- Scala 中的辅助构造函数提供了创建类实例的额外方式。
- 辅助构造函数使用
this关键字定义。它必须调用同一类中的另一个构造函数。 - 链式的辅助构造函数可以相互调用。这提供了多种初始化对象的方式。
- 辅助构造函数可以与默认参数结合使用。这为对象创建提供了更大的灵活性。