Kotlin的建筑师

时间:2017-05-31 05:20:39

标签: android constructor kotlin

我正在从官方文档中学习Kotlin,我在下面创建了一个class,其中我创建了一个constructor,其中有两个parametersconstructor的正文位于init块中。

class Person(name: String, surname: String) {
    init {
        Log.d("App", "Hello");
    }
}

好吧,我想再创建一个constructor parameter constructor。在Kotlin

中可以做什么

6 个答案:

答案 0 :(得分:40)

init不是构造函数的主体。它在具有主构造函数的上下文的主构造函数之后调用。

正如官方文件中所述:

  

主构造函数不能包含任何代码。初始化代码可以放在初始化块中,初始化块以init关键字为前缀:

class Customer(name: String) {
    init {
        logger.info("Customer initialized with value ${name}")
    }
}
  

请注意,主构造函数的参数可以在初始化程序块中使用。它们也可以在类体中声明的属性初始值设定项中使用:

class Customer(name: String) {
    val customerKey = name.toUpperCase()
}
  

事实上,为了声明属性并从主构造函数初始化它们,Kotlin有一个简洁的语法:

class Person(val firstName: String, val lastName: String, var age: Int) {
    // ...
}

根据您的问题,您可以添加一个构造函数来接受一个参数,如下所示:

class Person(name: String, surname: String) {

    constructor(name: String) : this(name, "") {
        // constructor body
    }

    init {
        Log.d("App", "Hello");
    }
}

但它看起来并不正确,因为我们不必要传递第二个参数空字符串。所以我们可以订购如下的构造函数:

class Person(name: String) {

    constructor(name: String, surname: String) : this(name) {
        // constructor body
    }

    init {
        Log.d("App", "Hello");
    }
}

希望它有所帮助。

答案 1 :(得分:3)

空值的第一种方法

// (name: String, surname: String)  default constructor signature
class Person(name: String, surname: String) {

    // init block , represents the body of default constructor 
    init {
        Log.d("primary", "Hello");
    }

    // secondary constructor 
    // this(name,"") call to default constructor
    constructor(name : String):this(name,""){
        Log.d("secondary", "Hello");
    }
}

为什么this(name,"")

  

如果类具有主构造函数,则每个辅助构造函数   需要直接或者委托给主构造函数   间接通过另一个辅助构造函数。代表团   使用this关键字完成同一个类的另一个构造函数:

kotlin不允许使用null之类的this(name,null),因此请使用?来表示类型为null

surname: String?
class Person(name: String, surname: String?) {

    init {
        Log.d("primary", "Hello");
    }

    constructor(name : String):this(name,null){
        Log.d("secondary", "Hello");
    }
}

答案 2 :(得分:2)

在类中使用constructor关键字来创建辅助构造函数。喜欢:

class Person(name: String, surname: String) {
    init {
        Log.d("App", "Hello");
    }
    constructor(id: Int) {

    }
}

有关详情,请查看Secondary Constructors

修改
规则:如果类具有主构造函数,则每个辅助构造函数需要直接或间接通过另一个辅助构造函数委托给主构造函数。使用this关键字完成对同一个类的另一个构造函数的委派。

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

因此,当您调用辅助构造函数时,它会调用主构造函数来初始化名称,然后在辅助构造函数中执行您的操作。在上面的示例中,通过调用主构造函数来初始化名称。

答案 3 :(得分:1)

辅助构造函数

该类还可以声明辅助构造函数,它以构造函数为前缀:

class Person {
    constructor(parent: Person) {
        parent.children.add(this)
    } } 

如果类具有主构造函数,则每个辅助构造函数需要直接或间接通过另一个辅助构造函数委托给主构造函数。使用this关键字完成对同一个类的另一个构造函数的委派:

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

请参阅https://kotlinlang.org/docs/reference/classes.html辅助构造函数部分

答案 4 :(得分:1)

这是你创建另一个构造函数的方法。

class Person(name: String, surname: String) {
    init {
        Log.d("App", "Hello");
    }
 constructor(id: Int) : this("example name", "example surname") {

}
}

永远记住,辅助构造函数必须使用this关键字引用主构造函数及其参数。

答案 5 :(得分:0)

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

class AuthModel {
var code: String? = null

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

internal constructor() {}
}