Scala构造函数

例子

主构造器

在 Scala 中,主要构造函数是类的主体。类名后跟一个参数列表,它们是构造函数的参数。(与任何函数一样,可以省略空参数列表。)

class Foo(x: Int, y: String) {

    val xy: String = y * x

    /* now xy is a public member of the class */

}

class Bar {

    ...

}

除非通过val关键字标记为实例成员,否则在其构造函数主体之外无法访问实例的构造参数:

class Baz(val z: String) 

// Baz 没有其他成员或方法,因此可以省略主体

val foo = new Foo(4, "ab")

val baz = new Baz("I am a baz")

foo.x // 不会编译:x 不是 Foo 的成员

foo.xy // returns "abababab": xy is a member of Foo

baz.z // returns "I am a baz": z is a member of Baz

val bar0 = new Bar

val bar1 = new Bar() // 构造函数括号在这里是可选的

实例化对象的实例时应该执行的任何操作都直接写入类的主体中:

class DatabaseConnection

    (host: String, port: Int, username: String, password: String) {

    /* first connect to the DB, or throw an exception */

    private val driver = new AwesomeDB.Driver()

    driver.connect(host, port, username, password)

    def isConnected: Boolean = driver.isConnected

    ...

}

请注意,将尽可能少的副作用放入构造函数被认为是一种很好的做法;而不是上面的代码,应该考虑拥有connect和disconnect方法,以便消费者代码负责调度 IO。

辅助构造函数

一个类可能有额外的构造函数,称为“辅助构造函数”。这些由构造函数定义以 形式定义def this(...) = e,其中e必须调用另一个构造函数:

class Person(val fullName: String) {    

  def this(firstName: String, lastName: String) = this(s"$firstName $lastName")

}

// 用法:

new Person("Grace Hopper").fullName // 格蕾丝·霍珀归来

new Person("Grace", "Hopper").fullName // 格蕾丝·霍珀归来

这意味着每个构造函数可以有不同的修饰符:只有一些可能是公开的:

class Person private(val fullName: String) {    

  def this(firstName: String, lastName: String) = this(s"$firstName $lastName")

}

new Person("Ada Lovelace") // 不会编译

new Person("Ada", "Lovelace") // 编译

通过这种方式,您可以控制使用者代码如何实例化类。

以上是 Scala构造函数 的全部内容, 来源链接: utcz.com/z/347544.html

回到顶部