Scala 辅助构造函数怎么用?

文章导读
Previous Quiz Next Scala 中的构造函数是一种特殊的方法,用于初始化对象。Scala 有两种构造函数:主构造函数和辅助构造函数。通过构造函数,你可以为字段设置初始值,并在创建对象时执行所需的任何设置。本章解释了如何在 Scala 编程中使用构造函
📋 目录
  1. A 辅助构造函数
  2. B 链式辅助构造函数
  3. C 带默认参数的辅助构造函数
  4. D Scala 辅助构造函数总结
A A

Scala - 辅助构造函数



Previous
Quiz
Next

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 关键字定义。它必须调用同一类中的另一个构造函数。
  • 链式的辅助构造函数可以相互调用。这提供了多种初始化对象的方式。
  • 辅助构造函数可以与默认参数结合使用。这为对象创建提供了更大的灵活性。