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

问题描述 投票:3回答:3

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

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

constructor kotlin primary-constructor
3个回答
3
投票

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

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

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

class Foo {
    val bar: Bar

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

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

class Foo(val bar: Bar)

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


1
投票

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

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

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

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

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

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

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

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

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


0
投票

主构造函数可以定义传递给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)之前执行。

© www.soinside.com 2019 - 2024. All rights reserved.