为什么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有两种类型的构造函数?的主要内容,如果未能解决你的问题,请参考以下文章