【问题标题】:Constructor vs. parameter in KotlinKotlin 中的构造函数与参数
【发布时间】:2019-06-19 22:41:13
【问题描述】:

有什么区别:

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)

构造函数提供了哪些优势?

【问题讨论】:

标签: kotlin constructor class-constructors


【解决方案1】:

当你这样定义你的类时:

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参数,你应该在使用构造函数时显式命名。

【讨论】:

    【解决方案2】:

    构造函数提供了哪些优势?

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

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

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

    【讨论】:

    • 当你说If you want to invoke the secondary constructor for this instantiation Pitch(10) you have to specify the parameter name explicitly like this: Pitch(width = 30) // now the secondary constructor is called - 你的意思是在那里使用capacity 而不是width
    • 谢谢。所以底线是 - 如果您在类实例化中指定全部或不指定主要构造函数参数,它将不会调用辅助类。如果你没有指定所有的主参数,但是你指定了与辅助构造函数相同数量的参数(在上面的例子中,1),那么它会调用辅助构造函数吗?
    • @Zorgan "[...] 如果您在类实例化中指定全部或不指定主要构造函数参数,它将不会调用辅助类 [构造函数]。"在这种情况下是的! “如果你没有指定所有的主参数,但你指定了与辅助构造函数相同数量的参数(在上面的例子中,1)那么它会调用辅助构造函数吗?”是的,它会!但请注意,它与哪个是主构造器,哪个是辅助构造器这一事实无关。
    • @Zorgan 编译器将采用与签名匹配的第一个构造函数(无论是主要还是次要),而无需插入默认值。看这里:pl.kotl.in/SkEaEEjmV
    • 如果您想确定并且参数/属性名称不同,请使用如上所示的命名参数。反正我伤不起。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多