Kotlin和构造函数,初始化

时间:2019-05-21 12:30:23

标签: kotlin initialization optional-parameters optional-arguments

很抱歉提出了一个非常新手的Kotlin问题,但我一直在努力了解与构造函数和初始化有关的一些东西。

我有这个类和构造函数:

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             

我在这里想要做的是在构造函数中使用默认值来提供三个可选参数。之所以在类主体中声明它们是因为我需要从主类访问它们。

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

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

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

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

2 个答案:

答案 0 :(得分:3)

您可以直接在主构造函数中声明属性。这意味着您可以在类主体中删除显式声明:

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

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

答案 1 :(得分:0)

@JvmOverloads批注可能会重载具有不同参数大小的构造函数

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

然后,该类获得了三个带有可选参数的构造函数

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