Kotlinプライマリコンストラクターセカンダリコンストラクターのデフォルトパラメーター初期化コードブロックの初期化順序

package set

import java.util.*
import kotlin.math.absoluteValue

//临时变量 只是用一次推荐使用下划线开头
class Player(
    _name: String, _age: Int, _isNormal: Boolean //构造参数
) {

    //属性

    var name = _name
        get() = field.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
        set(value) {
            field = value.trim()
        }
    //取绝对值
    var age = _age
        get() = field.absoluteValue
        set(value) {
            field = age.absoluteValue
        }
    var isNormal = _isNormal;

}

fun main() {
    val p = Player("Jack", 20, true)
    p.name = "rose"
    println(p.name)
    println(p.age)
    println(p.isNormal)
}

書き込みを簡略化するために、上記に属性の正方形を配置できます

package set

import java.util.*
import kotlin.math.absoluteValue

//临时变量 只是用一次推荐使用下划线开头
class Player(
    _name: String,
    var age: Int, 
    var isNormal: Boolean //构造参数
) {

    //属性
    var name = _name
        get() = field.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
        set(value) {
            field = value.trim()
        }
   

}

fun main() {
    val p = Player("Jack", 20, true)
    p.name = "rose"
    println(p.name)
    println(p.age)
    println(p.isNormal)
}

Javaの場合、this.age=ageなどの操作を減らすことです。

よく知られています。javaで複数のコンストラクターを作成できます。kotlinで実装する方法

次に、セカンダリコンストラクタについて説明します。

package set

import java.util.*
import kotlin.math.absoluteValue

//临时变量 只是用一次推荐使用下划线开头
class Player(
    _name: String, var age: Int, var isNormal: Boolean //构造参数
) {

    //属性
    var name = _name
        get() = field.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
        set(value) {
            field = value.trim()
        }

    //次构造函数
    constructor(name: String) : this(name, age = 20, isNormal = false) {
        //里面可以对代码进行操作
        this.name = name.uppercase(Locale.getDefault());
    }

}

fun main() {
    val p = Player("Jack", 20, true)
    p.name = "rose"
    println(p.name)
    println(p.age)
    println(p.isNormal)
    val p2 = Player("Jack Liu")
    println(p2.name)
}


セカンダリコンストラクタは、プライマリコンストラクタを呼び出して、デフォルト値を初期化して提供する必要があります。 

デフォルトパラメータ

実際、二次コンストラクターの使用シナリオは、二次コンストラクターでは実行されません。コンストラクターで記述できます

package set

import java.util.*
import kotlin.math.absoluteValue

//临时变量 只是用一次推荐使用下划线开头
class Player(
    _name: String, var age: Int=20, var isNormal: Boolean=false //构造参数
) {

    //属性
    var name = _name
        get() = field.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
        set(value) {
            field = value.trim()
        }

}

fun main() {
    val p = Player("Jack", 20, true)
    p.name = "rose"
    println(p.name)
    println(p.age)
    println(p.isNormal)
    val p2 = Player("Jack Liu")
    println(p2.name)
}

以下のinitコードブロックをご覧ください

以前はJavaに静的コードブロックがありました

クラスが仮想マシンにロードされるときに初期化されます

initの初期化ブロックはいつ実行されますか?

関数が再構築されたときに実行されます。

渡された値を確認するために使用できます

package set

import java.util.*
import kotlin.math.absoluteValue

//临时变量 只是用一次推荐使用下划线开头
class Player(
    _name: String, var age: Int = 20, var isNormal: Boolean = false //构造参数
) {

    //属性
    var name = _name
        get() = field.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
        set(value) {
            field = value.trim()
        }

    init {
        //检查是否
        require(age > 0) { "age 必须大于0" }
        require(name.isNotBlank()) { "姓名必须设置" }
    }
}

fun main() {
    val p = Player("Jack", 20, true)
    p.name = "rose"
    println(p.name)
    println(p.age)
    println(p.isNormal)
    val p2 = Player("Jack Liu")
    println(p2.name)
    val p3 = Player("Jack Liu", age = 0)
}

 これらのコードが初期化される場所が多い順序は何ですか?

プライマリコンストラクタで宣言されたプロパティ。

クラスレベルの属性割り当て。

初期化ブロックでのプロパティの割り当てと関数呼び出し

二次コンストラクターでのプロパティの割り当てと関数呼び出し

 

おすすめ

転載: blog.csdn.net/mp624183768/article/details/123868280
おすすめ