为什么Kotlin有两种类型的构造函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么Kotlin有两种类型的构造函数?相关的知识,希望对你有一定的参考价值。

Kotlin有两种类型的构造函数,主要和次要。有两种类型的目的是什么?在我看来,它使代码更复杂和不一致。如果两种类型的构造函数都创建了类的对象,则它们对于类同样重要。

同时,多个初始化器也会引入混淆并降低可读性。

答案

当您需要将作为构造函数参数传递的值保存到实例的属性时,主构造函数涵盖了常用的用例。

基本上,主构造函数提供了一个简写,用于声明属性并从构造函数参数初始化它。

请注意,您可以在没有主构造函数的情况下执行相同的操作:

class Foo {
    val bar: Bar

    constructor(barValue: Bar) {
        bar = barValue
    }
}

但是,由于这经常发生在代码库中,因此Kotlin主要构造函数用于减少样板:

class Foo(val bar: Bar)

辅助构造函数可以补充或替换主要构造函数,以便支持单个类的几个构造例程。

另一答案

哲学:主要目的 - kotlin是pragmatic语言。它的主要思想是:排除最常见的样板。

在C#/ Java中使用的许多类只有一个具有以下语义的构造函数:

  • 部分参数存储在字段中(具有相同的名称)
  • 构造函数使用部分参数来创建其他字段(或额外验证)

此外,许多辅助构造函数用于使用默认值调用主构造函数(请参阅此question for C# language

因此:要拥有简化的代码(反映本质),您必须具备:

  • 支持构造函数参数,这些参数将自动存储到字段中(不含this.myData = myData
  • 支持从构造函数参数创建字段的能力

上述两个项都是必需的,因此所有构造函数都具有相同的输入值(因为所有字段都应该初始化,但是它们是从构造函数体中设置的)。因此,您必须具有主构造函数,它将执行初始化。

在应用此逻辑之后,我们得到主要规则:要覆盖最常见的类初始化方案,您必须具有能够定义默认参数值的主构造函数。此外,您应该能够创建辅助构造函数以涵盖所有其他方案。

所以,我重复一个主要想法:需要初级构造函数来覆盖最常见的情况(实用目的)

另一答案

主构造函数可以定义传递给init块的参数。例如:

class Foo(a: Bar){
    val b : Bar

    init { 
         b = a // value of "a" is known from primary constructor
    }

    constructor(a: Boo) : this(a.toBar())
}

如果没有明确的主构造函数调用,就无法确定在a中应该使用init的值/类型。

主构造函数和初始化程序块始终在辅助构造函数块(doc)之前执行。

以上是关于为什么Kotlin有两种类型的构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何从片段 KOTLIN 中调用意图 [重复]

一个类让你了解 kotlin 最基本的语法

将接口从片段传递到kotlin中的活动

Kotlin类与继承

Kotlin:'这种类型有一个构造函数,因此必须在这里初始化',但没有声明构造函数

Kotlin函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )