构造器

类可以拥有一个主构造器和一个或更多的二级构造器。主构造器是类头部的一部分,紧跟类名(参数类型可选)。

class Person constructor(firstName: String) {}

如果主构造器没有任何注解或可见性修饰符,constructor关键字可以省略。

class Person(firstName: String) {}

主构造器不能包含任何代码。初始化代码可以放在初始化块中,它的前缀使用init关键字:

class Customer(name: String) {
    init {
        logger.info("Customer initialized with value ${name}")
    }
}

需要注意的是主构造器中的参数可以再初始化快中使用,也可以在类主体中使用:

class Customer(name: String) {
    val customerKey = name.toUpperCase()
}

实际上,定义属性并在主构造器中初始化它们,Kotlin有一种简洁的语法:

class Person(val firstName: String, val lastName: String, var age: Int) {}

和正常的属性定义类似,主构造器中的属性参数可以使用var(可修改)val(只读)修饰。

如果构造器有注解或可见性修饰符,constructor关键字是必须的,修饰符在constructor之前。

class Customer public @Inject constructor(name: String) { ... }

二级构造器

类同样可以定义二级构造器,同样使用constructor关键字。

class Person {
    constructor(parent: Person) {
        parent.children.add(this)
    }
}

如果类有一个主构造器,每个二级构造器都都需要直接的或间接的调用主构造器。调用类中的其他构造器时使用this关键字。

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

如果一个非抽象类没有定义任何构造器(主构造器或任何二级构造器),那么它将会生成一个不带任何参数的主构造器。并且构造器是公共的。如果不想让构造器是公共的,你可以定义一个空的主构造器,并使用非默认的可见性修饰符。

class DontCreateMe private constructor () {}

需要注意的是:在JVM上,如果主构造器的所有参数都带有默认值,那么编译器将会生成一个无参数的构造器,并在这个无参构造器中使用这些默认值。这种特性可以很方便的使用类似于jacksonipa库,这些库会使用无参构造器创建实例。

results matching ""

    No results matching ""