Kotlin 和构造函数,初始化

Kotlin and constructors, initializing

很抱歉问了一个非常新手的 Kotlin 问题,但我正在努力理解与构造函数和初始化相关的一些事情。

我有这个 class 和构造函数:

class TestCaseBuilder constructor(
     caseTag: String = "Case",
     applType: Buy.ApplFor = Buy.ApplFor.PROOFFINANCE,
     komnr: String = "5035") {

     var caseTag: String       = caseTag
     var applType: Buy.ApplFor = applType  
     var komnr: String         = komnr             

我在这里要做的是在构造函数中使用三个可选参数,并为它们使用默认值。我在 class 正文中声明它们的原因是因为我需要从主 class.

访问它们

现在,此代码有效。当我 运行 它时没有错误。但是 IntelliJ 对变量给出了以下注释(例如:caseTag):

Property is explicitly assigned to parameter caseTag, can be declared
directly in constructor.

我在搜索时发现这是使用 init {} 的示例,但我得到的结果包括两次初始化变量,一次在构造函数中,然后在 init {} 中。我会说哪个显然不正确?

在构造函数中拥有(或拥有)可选参数,然后从中创建 class 个变量有什么更好的?

您可以直接在主构造函数中声明属性。这意味着您可以在 class body:

中删除显式声明
class TestCaseBuilder constructor(
     var caseTag: String = "Case",
     var applType: Buy.ApplFor = Buy.ApplFor.PROOFFINANCE,
     var komnr: String = "5035")

如果您的主构造函数没有任何注释或可见性修饰符(默认为 public),您也可以删除 constructor 关键字。

@JvmOverloads 注解可以过载不同参数大小的构造函数

class TestCaseBuilder @JvmOverloads constructor(
    var caseTag: String = "Case",
    var applType: Buy.ApplFor = Buy.ApplFor.PROOFFINANCE,
    var komnr: String = "5035"
)

然后 class 得到了三个带有可选参数的构造函数

val a = TestCaseBuilder("CaseA")
val b = TestCaseBuilder("CaseB", Buy.ApplFor.SomethingElse)
val c = TestCaseBuilder("CaseB", Buy.ApplFor.SomethingElse, "1111")