Kotlin系列之从构造方法

上一节说到了Kotlin中的主构造方法和初始化语句块,今天来看看Kotlin中的从构造方法。

在Java中的问题

在Java中,我们有时候为了用不同的参数来创建一个对象,就会声明多个构造方法,也就是构造方法的重载。然后我们可能会让某些构造方法的某些参数为默认值。在Java中是没有主构造方法和从构造方法的概念的,都叫构造方法,就像下面这样。

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class User {

private String mName;

private int mAge;
public User(String nickname){
this.mName = nickname;
this.mAge = 10;
}

public User(String nickname, int age){
this.mName = nickname;
this.mAge = age;
}
}

上面的代码的mAge属性在我们不传入时使用默认值10。这样的场景在我们编程中经常遇到,那么在Kotlin中我们又该怎么写呢。

Kotlin中的从构造方法

我们先复习一下Kotlin中的主构造方法和从构造方法的区别。
主构造方法是主要而简洁的初始化类的方法,声明在类的外部。
从构造方法是声明在类内部的初始化类的方法。
就如下面的这样。

Kotlin代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//主构造方法
open class User(val isMan: Boolean){

//从构造方法
constructor(nickname: String) : this(true) {

}

//从构造方法
constructor(nickname: String, age: Int) : this(true) {

}
}

fun main(args: Array<String>){
val user = User("小米", 12);
}

上面的主构造方法使用了val关键字,这样就是在声明主构造方法的时候为该类声明了一个属性isMan
上面定义在类内部的就是从构造方法,为了实现用不同的参数初始化对象,这里定义了两个从构造方法。有人可能对上面的this的使用存在疑问。上面的this与Java中一样,用于在同一个类中调用其他的主构造方法或者从构造方法。

还有一个疑问,: this(true)这个可以不写吗?答案是不可以。因为我们定义了主构造,所以Kotlin中限定我们的从构造方法必须要直接或者间接委托给主构造方法,也就是我们也可以委托给另一个从构造方法,但委托链的最终要委托给主构造方法。

就像下面这样

Kotlin代码

1
2
3
4
5
6
7
8
9
10
11
12
13
//主构造方法
open class User(val isMan: Boolean){

//从构造方法
constructor(nickname: String) : this(true) {

}

//从构造方法
constructor(nickname: String, age: Int) : this(nickname) {

}
}

代码中constructor(nickname: String, age: Int)委托了 constructor(nickname: String),然后constructor(nickname: String)又委托给了主构造方法,在这条委托链的末端就是主构造方法。

写在最后

今天的内容很少,就只是单纯说说Kotlin中的从构造方法,这在Java中是没有这个概念的,同时他还介绍了从构造方法的委托规则。

如果博客对您有帮助,不妨请我喝杯咖啡...