委托Kotlin中的可选参数解析

时间:2018-08-09 01:17:39

标签: kotlin

在Kotlin中,如果我有一个调用构造函数的函数(或另一个函数),是否可以将默认参数的确定委托给基础构造函数/函数?

此语法无效,但希望可以说明我正在尝试做的事情:

fun buildMyObject(stringParam: String?, intParam: Int?): MyClass {
    return MyClass(stringParam, intParam)
}

class MyClass(val stringParam: String = "Hello world!", val intParam: Int = 42)

1 个答案:

答案 0 :(得分:2)

完全不支持您想要的内容。但是,如果您对buildMyObject的住处有一定的灵活性,则可以使用以下方法:

class MyClass(val stringParam: String = defaultString, val intParam: Int = defaultInt) {

    private constructor(stringParam: String?, intParam: Int?) : this(
            stringParam ?: defaultString,
            intParam ?: defaultInt
    )

    companion object {
        private const val defaultString = "Hello world!"
        private const val defaultInt = 42

        fun buildMyObject(stringParam: String?, intParam: Int?): MyClass {
            return MyClass(stringParam, intParam)
        }
    }
}

这有几个不错的特点:

  • 让用户仍然调用null安全MyClass构造函数
  • 在定义默认值的地方不重复
  • 如果尝试使用when并在有或没有每个参数的情况下调用,构造函数的数量并不会成倍增长(想象一下,如果添加第三个参数会发生什么情况!)
  • 将可为空的构造方法保留为私有,因此调用方只有通过工厂方法时才能使用可为空的构造方法