Kotlin二级构造函数

iro*_*nic 91 syntax constructor kotlin

如何在Kotlin中声明辅助构造函数?

有没有关于这方面的文件?

以下不编译......

class C(a : Int) {
  // Secondary constructor
  this(s : String) : this(s.length) { ... }
}
Run Code Online (Sandbox Code Playgroud)

And*_*lav 81

更新:自M11(0.11.*)以来,Kotlin支持辅助构造函数.


目前,Kotlin仅支持主构造函数(稍后可能支持辅助构造函数).

辅助构造函数的大多数用例通过以下技术之一解决:

技术1.(解决您的情况)在您的班级旁边定义工厂方法

fun C(s: String) = C(s.length)
class C(a: Int) { ... }
Run Code Online (Sandbox Code Playgroud)

用法:

val c1 = C(1) // constructor
val c2 = C("str") // factory method
Run Code Online (Sandbox Code Playgroud)

技术2.(也可能有用)定义参数的默认值

class C(name: String? = null) {...}
Run Code Online (Sandbox Code Playgroud)

用法:

val c1 = C("foo") // parameter passed explicitly
val c2 = C() // default value used
Run Code Online (Sandbox Code Playgroud)

请注意,默认值适用于任何函数,不仅适用于构造函数

技术3.(当您需要封装时)使用伴随对象中定义的工厂方法

有时您希望构造函数是私有的,并且只有客户端可以使用工厂方法.目前,这只能通过伴随对象中定义的工厂方法实现:

class C private (s: Int) {
    companion object {
        fun new(s: String) = C(s.length)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

val c = C.new("foo")
Run Code Online (Sandbox Code Playgroud)

  • 如果从不支持辅助构造函数,则应重命名主构造函数.;) (13认同)
  • Andrey Breslav,我认为放弃对Kotlin中辅助构造函数的支持是一个坏主意,因为这些构造函数有时是必需的,特别是在使用Java框架和扩展Java类时.希望你能尽快回来. (2认同)
  • 这很有趣:辅助构造函数返回了:) (2认同)
  • 在 M11 中添加了二级构造函数。 (2认同)

ces*_*rds 27

文档所述,您可以通过这种方式使用辅助构造函数

class GoogleMapsRestApiClient constructor(val baseUrl: String) {

    constructor() : this("https://api.whatever.com/")

}
Run Code Online (Sandbox Code Playgroud)

请记住,您必须扩展第一个构造函数行为.


Ras*_*bal 15

声明一个辅助构造函数Kotlin只需使用constructor关键字:like

这是一个主要的构造函数:

class Person constructor(firstName: String) {

}
Run Code Online (Sandbox Code Playgroud)

要么

class Person(firstName: String) {

}
Run Code Online (Sandbox Code Playgroud)

对于像这样的辅助构造函数代码:

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}
Run Code Online (Sandbox Code Playgroud)

否则必须调用主构造函数,编译器将抛出以下错误

Primary constructor call expected
Run Code Online (Sandbox Code Playgroud)


Pal*_*rji 11

来不及回答了,但这是我的微薄贡献:)

由于 Kotlin 支持默认参数值(注意:我想使用 null 的幂),如下所示:

data class MyClass(val a: Int? = null, val b: String? = null, val c: Double? = null)
Run Code Online (Sandbox Code Playgroud)

我们不需要有多个构造函数。但即使我们想要它,我们也可以这样做:

data class MyClass(val a: Int?, val b: String?, val c: Double?){
    constructor() : this(null,null,null)
    constructor(a : Int) : this(a,null,null)
    constructor(a : Int, b: String) : this(a,b,null)
}
Run Code Online (Sandbox Code Playgroud)

我们可以通过以下方式实例化这个类:

println(MyClass().toString())
println(MyClass(1).toString())
println(MyClass(1,"String").toString())
println(MyClass(1,"String",0.5).toString())
Run Code Online (Sandbox Code Playgroud)

让我们看看结果:

在此输入图像描述


Hit*_*ahu 10

Android 中具有多个构造函数的自定义视图示例:

class ShaderBackground : View {


    constructor(context: Context) : super(context) {
        init()
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        init()
    }

    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    ) {
        init()
    }

    private fun init() {

       // Init stuff here
        paint = Paint();
        paint.strokeWidth = 10f;
        paint.style = Paint.Style.FILL_AND_STROKE;

    }
Run Code Online (Sandbox Code Playgroud)


Coo*_*ind 8

构造函数init

class PhoneWatcher : TextWatcher {

    private val editText: EditText
    private val mask: String

    private var variable1: Boolean = false
    private var variable2: Boolean = false

    init {
        variable1 = false
        variable2 = false
    }

    constructor(editText: EditText) : this(editText, "##-###-###-####")

    constructor(editText: EditText, mask: String) {
        this.editText = editText
        this.mask = mask
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)


Osv*_*ino 6

您可以在Kotlin中定义多个构造函数,constructor但需要跳过默认构造函数class AuthLog(_data: String)

class AuthLog {

    constructor(_data: String): this(_data, -1)

    constructor(_numberOfData: Int): this("From count ", _numberOfData)

    private constructor(_data: String, _numberOfData: Int)

}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此处