如何在 Kotlin 中初始化构造函数?
构造函数是初始化类属性的一种简洁方式。或者我们可以说它是一个特殊的成员函数,在创建类的对象时调用,主要是为了初始化变量或属性。一个类需要有一个构造函数,如果我们不声明构造函数,那么编译器会生成一个默认构造函数。它是一个特殊的成员函数,在实例化(创建)对象时调用。但是,它们在 Kotlin 中的工作方式略有不同。在 Kotlin 中,有两种类型的构造函数:
- 主构造函数——初始化类的简洁方法
- 辅助构造函数——允许你放置额外的初始化逻辑
在Java世界中,我们习惯于在构造函数中初始化类的字段,如下代码所示:
Kotlin
class Student {
int roll_number;
String name;
Student(int roll_number,String name) {
this.roll_number = roll_number;
this.name = name;
}
}
因此,如果参数的名称与属性的名称相似(通常是为了使代码更具可读性),我们需要使用 this 关键字。在这个秘籍中,我们将看到如何在 Kotlin 中实现相同的东西(显然用更少的代码)。
分步实施
让我们看看上面提到的初始化构造函数的步骤:
第 1 步: Kotlin 提供了一种语法,可以用更少的代码初始化属性。下面是 Kotlin 中类初始化的样子:
class Student (var roll_number: Int, var name:String)
第 2 步:您甚至不需要定义类的主体,属性的初始化仅在主构造函数中进行(主构造函数是类头的一部分)。显然,您可以选择 var 或 val,具体取决于您是否需要保持属性可变。现在,如果你尝试创建一个对象,你可以这样做:
var student_A=Student (1, "Rashi Karanpuria" )
第 3 步:为了确认,让我们尝试打印它的属性,看看我们是否能够初始化它:
printin ("Roll number: $(student_A. roll_number} Name: ${student_A. name}" )
这是输出:
Roll number: 1 Name: Rashi Karanpuria
第 4 步:但是,如果需要,您也可以在构造函数中放入默认值:
class Student constructor (var roll_number: Int, var name : String="Sheldon")
第 5 步:然后,您可以创建如下对象:
var student_sheldon= Student (25) //object with name Sheldon and
age 25
var student_amy=Student (25, "Amy" ) // Object with name Amy and
age 25
第 6 步:如果类有主构造函数,则每个辅助构造函数都需要直接或间接通过另一个辅助构造函数委托给主构造函数。
第 7 步:我们使用这个关键字委托给同一个类的另一个构造函数:
class Person (val name: String) {
constructor (name: String, lastName: String) : this(name) {
// Do something maybe
}
}
第 8 步:我们也可能遇到必须初始化类中的其他东西的情况,而不仅仅是类的属性。例如,这种情况可能是打开数据库连接。在Java中,这是在构造函数本身中完成的,但在 Kotlin 中,我们有一个init块。初始化代码可以放在一个init块中
class Student (var roll_number: Int, var name: String) {
init {
logger. info( "Student initialized")
}
}
第九步:有时,我们也通过依赖注入来初始化一个类的属性。如果您使用过 Dagger2,那么您必须熟悉直接注入到类的构造函数中的对象。为此,我们在构造函数关键字之前附加了 @Inject 注释。每当构造函数有注解或可见性修饰符时,我们就需要有 constructor 关键字。下面给出了构造函数关键字的示例:
class Student #Inject constructor (compositeDisposable:
CompositeDisposable) { . . . }
第 10 步:在这里,我们将CompositeDisposable类型的对象注入到构造函数中,由于我们使用注解 (@Inject) 来执行此操作,因此我们需要应用构造函数关键字。
第十一步:当你扩展一个类时,你需要初始化超类。这在 Kotlin 中也很简单。如果您的类有一个主构造函数,则必须使用主构造函数的参数在那里初始化基类型。这是一个相同的例子:
class Student constructor
(var roll_number: Int, var name : String) : Person (name)