Kotlin中的构造函数与参数

时间:2019-01-26 07:11:15

标签: 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)

构造函数有什么优点?

2 个答案:

答案 0 :(得分:2)

当您像这样定义班级时:

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 Pitch (var width: Int = 3, var height: Int = 5, capacity: Int) {

}

除默认值外,所有参数都是必需的。因此,在这种情况下,您不能将构造函数与空参数一起使用,您需要至少指定一个参数capacity

val p = Pitch(capacity = 40)

因此,在第一种情况下,您可以使用不带参数的构造函数。在第二种情况下,如果要调用构造函数并传递capacity参数,则应在使用构造函数时显式命名它。

答案 1 :(得分:1)

  

构造函数有什么优点?

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

spyOn(SomeTypescriptClass, "SomeTypescriptClassProperty");

在两种情况下:export type IDataMock<T> = { [P in keyof T]?: IDataMock<T[P]>; }; export function dataMock<T>(instance: IDataMock<T>): T { return instance as any; } // so where you need const obj = dataMock<SomeBigType>({onlyOneProperty: "some value"}); 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(10)将调用辅助构造函数。

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

Pitch(10, 20)

您也可以将其转过来,并明确设置Pitch(10)并保留其默认值Pitch(width = 30)

height

如您所见,使用两个具有默认值的参数(属性)将使您有4种可能的方式,可以仅通过主构造函数实例化该类。

指定辅助构造函数对提供实例化类的替代方法特别有用。


像这样使用

width

仅当您无法从Pitch(height = 30) class Pitch(var width: Int = 3, var height: Int = 5, capacity: Int) 推论capacity的值时才有意义。因此,这取决于您的用例。