Kotlin二级构造函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin二级构造函数相关的知识,希望对你有一定的参考价值。

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

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

以下不编译......

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

更新:自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")
另一答案

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

   @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
      }
   }
另一答案

作为documentation points,你可以用这种方式使用辅助构造函数

class GoogleMapsRestApiClient constructor(val baseUrl: String) {

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

}

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

另一答案

声明一个辅助构造函数Kotlin只需使用constructor关键字: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
另一答案

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
    }
    ...
}
另一答案

您可以使用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 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中的工作方式相同。

更新

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

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

你可以试试这个。

另一答案

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

class  C(a:Int){
  constructor(s:String):this(s.length){..}
}
另一答案

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

以上是关于Kotlin二级构造函数的主要内容,如果未能解决你的问题,请参考以下文章

如何从片段 KOTLIN 中调用意图 [重复]

将接口从片段传递到kotlin中的活动

Android开发学习之路--Kotlin之类及对象

Kotlin 主构造函数 次构造函数 默认参数 init代码块 初始化顺序

Kotlin类与继承

在 Visual Studio 中创建构造函数的代码片段或快捷方式