Kotlin二级构造函数

时间:2013-10-10 15:07:33

标签: syntax constructor kotlin

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

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

以下不编译...

class C(a : Int) {
  // Secondary constructor
  this(s : String) : this(s.length) { ... }
}

13 个答案:

答案 0 :(得分:77)

更新:由于M11(0.11。*)Kotlin支持secondary constructors


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

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

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

fun C(s: String) = C(s.length)
class C(a: Int) { ... }

用法:

val c1 = C(1) // constructor
val c2 = C("str") // factory method

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

class C(name: String? = null) {...}

用法:

val c1 = C("foo") // parameter passed explicitly
val c2 = C() // default value used

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

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

有时您希望构造函数是私有的,并且只有客户端可以使用工厂方法。目前,只有在配套对象

中定义的工厂方法才能实现
class C private (s: Int) {
    companion object {
        fun new(s: String) = C(s.length)
    }
}

用法:

val c = C.new("foo")

答案 1 :(得分:23)

作为documentation points,您可以这样使用辅助构造函数

class GoogleMapsRestApiClient constructor(val baseUrl: String) {

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

}

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

答案 2 :(得分:14)

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

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

class Person constructor(firstName: String) {

}

class Person(firstName: String) {

}

用于辅助构造函数代码,如下所示:

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

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

Primary constructor call expected

答案 3 :(得分:7)

具有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
    }
    ...
}

答案 4 :(得分:5)

您可以使用constructor在Kotlin中定义多个构造函数,但是您需要跳过默认构造函数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)

}

For more details see here

<强>更新

现在您可以定义默认构造函数

class AuthLog(_data: String, _numberOfData: Int) {

    constructor(_data: String): this(_data, -1) {
        //TODO: Add some code here if you want
    }

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

}

答案 5 :(得分:4)

我刚看到这个问题,我认为可能有另一种技术听起来比安德烈提出的技术更好。

class C(a: Int) {
    class object {
        fun invoke(name: String) = C(name.length)
    }        
}

您可以编写类似val c:C = C(3)val c:C = C("abc")的内容,因为invoke方法的工作方式与apply方法在Scala中的工作方式相同。

<强>更新

截至目前,辅助构造函数已经是语言规范的一部分,因此不应使用此解决方法。

答案 6 :(得分:1)

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

你可以试试这个。

答案 7 :(得分:1)

下面的代码段应该可以使用

class  C(a:Int){
  constructor(s:String):this(s.length){..}
}

答案 8 :(得分:1)

来不及回答,但这是我的不起眼的贡献:)

由于Kotlin支持默认参数值,(请注意:我想使用null的幂)是这样的:

data class MyClass(val a: Int? = null, val b: String? = null, val c: Double? = null)

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

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)
}

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

println(MyClass().toString())
println(MyClass(1).toString())
println(MyClass(1,"String").toString())
println(MyClass(1,"String",0.5).toString())

并同时查看结果:

enter image description here

答案 9 :(得分:1)

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;

    }

答案 10 :(得分:0)

kotlin辅助构造函数示例

class Person(name: String){
    var name=""
    var age=0

    constructor(age :Int,name : String)  : this(name){
        this.age=age
        this.name=name
    }
    fun display(){
        print("Kotlin Secondary constructor $name  , $age")
    }
}

主要功能

fun main(args : Array<String>){

    var objd=Person(25,"Deven")
    objd.display()
}

答案 11 :(得分:0)

我对大多数答案感到有些困惑。 为了易于理解,我添加了一个包含更多元素的示例:

   @JsonInclude(JsonInclude.Include.NON_NULL)
   data class Response(val code: String) {
      var description: String? = null
      var value: String? = null

      constructor(code: String, description: String?) : this(code) {
          this.description = description
      }

      constructor(code: String, description: String?, value: String) : this(code, description) {
          this.value = value
      }
   }

答案 12 :(得分:0)

使用变量“internal”,然后您可以在单个类中添加多个构造函数,如下所示。这将完美无缺。

class AuthModel {
var code: String? = null

internal constructor(code: String?) {
    this.code = code
}

internal constructor() {}
}