Kotlin 中的构造函数与参数

Constructor vs. parameter in Kotlin

有什么区别:

class Pitch(var width: Int = 3, var height: Int = 5) {

    constructor(capacity: Int): this()

}

class Pitch(var width: Int = 3, var height: Int = 5, capacity: Int)

构造函数有什么优势?

当您这样定义 class 时:

class Pitch (var width: Int = 3, var height: Int = 5) {

    constructor(capacity: Int): this() {}

}

您可以使用不带参数的构造函数创建 Pitch 的实例,即:

val p = Pitch()

// also you can invoke constructors like this
val p1 = Pitch(30)     // invoked secondary constructor
val p2 = Pitch(30, 20) // invoked primary constructor

当您这样定义 class 时:

class Pitch (var width: Int = 3, var height: Int = 5, capacity: Int) {

}

除具有默认值的参数外,所有参数都是必需的。所以在这种情况下你不能使用带空参数的构造函数,你需要至少指定一个参数 capacity:

val p = Pitch(capacity = 40)

所以在第一种情况下,使用不带参数的构造函数具有优势。在第二种情况下,如果你想调用构造函数并传递 capacity 参数,你应该在使用构造函数时明确命名它。

What advantages does the constructor provide?

在您的第一个片段中,您定义了两个构造函数,一个是主要的,一个是次要的。主构造函数的这一特殊之处在于它始终必须由任何辅助构造函数调用。

class Pitch (var width: Int = 3, var height: Int = 5) /* primary constructor */ {
    // secondary constructor invokes primary constructor (with default values)
    constructor(capacity: Int): this()
}

在这两种情况下:Pitch()Pitch(10, 20) 调用主构造函数。 Pitch(10) 将调用辅助构造函数。

如果要为此实例化调用主构造函数Pitch(10),则必须像这样明确指定参数名称:

Pitch(width = 30)

您也可以将其翻转并明确设置 height,并保留 width 的默认值:

Pitch(height = 30)

如您所见,使用两个参数(属性),每个参数(属性)都具有默认值,这使您有 4 种可能性可以仅通过主构造函数实例化 class。

指定辅助构造函数对于提供实例化 class.

的替代方法特别有用

这样使用

class Pitch(var width: Int = 3, var height: Int = 5, capacity: Int)

只有在无法从 widthheight 推导出 capacity 的值时才有意义。因此,这取决于您的用例。