属性とフィールド

3288 ワード

ディレクトリプロジェクトのソースコードkotlin-classプロジェクトに戻る
プロパティは初期化され、直接値が割り当てられていない場合はコンストラクション関数に書き込む必要があります.
マスターコンストラクション関数の属性を宣言するには、次の手順に従います.
class PfA(val a: Int, var b: Int)

属性を宣言する、二次構造関数の初期化またはinitブロックの初期化を行う.
class PfB {
    var a: Int
    val b: Int
    val c: Int?
    //           val, var
    constructor(a: Int, b: Int, c: Int) {
        this.a = a
        this.b = b
        this.c = c
    }
}

class PfBB(a: Int, b: Int) {
    val a = a
    val b: Int
    init {
        this.b = b
    }
}

初期化の属性を直接割り当てます.
class PfC {
    var a = 0
    val b = 1
    // val            ,    var   !
    //       backing field  
    val c get() = true
}

完全な属性宣言構文:
var [: ] [= ]
    []

初期化式、getter、setterはオプションです.
属性タイプが初期化式で推定できる場合、getterのreturn戻り値から推定できる.
    // val    getter,     setter
    //     getter        ,         
    val allByDefault
        get() = 1 // val     getter,              

Backing Fields
Kotlinではjavaのgetter,setterがデフォルトで実装されている.しかし、カスタマイズして論理を修正することもできる.
注意:コンストラクション関数で初期化しない場合、var変数は初期化式を使用する必要がありますが、val変数はgetterで初期化式の代わりに使用できます.
    // Backing Fields
    //    field    ,   getter setter      ,        .
    var getsetvar: Int = 1
        set(value) {
            field = value + 1
        }

    //    getter            
    var getsetvar2: Int = 1 //       
        get() {
            if(field == 1) {
                println("   1,    0")
                return 0
            }
            return field
        }
        set(value) {
            field = value + 1
        }

上記のプロパティをテストして検証します.
    @Test fun testProperties() {
        //      1
        assertEquals(1, address.getsetvar)
        //     2
        address.getsetvar = 2
        // setter    1,        3
        assertEquals(3, address.getsetvar)
    }

    @Test fun testProperties2() {
        //      1, getter        1     0
        assertEquals(0, address.getsetvar2)
        //     3, setter    1,     4
        address.getsetvar2 = 3
        assertEquals(4, address.getsetvar2)
    }

アクセサgetter setterの可視性
var setterVisibility: String = "abc"
    private set // the setter is private and has the default implementation

var setterWithAnnotation: Any? = null
    @Inject set // annotate the setter with Inject

Compile-Time Constants
コンパイル時定数:-Top-level or member of an object-Initialized with a value of type String or a primitive type-No custom getter
このような属性は注釈で使用できます.
const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"

@Deprecated(SUBSYSTEM_DEPRECATED) fun foo() { ... }

遅延初期化プロパティ(Late-initialized Properties)
注入または試験方法に依存する@setup, @beforeなどの方法で再初期化を行う.
public class MyTest {
    lateinit var subject: TestSubject

    @SetUp fun setup() {
        subject = TestSubject()
    }

    @Test fun test() {
        subject.method()  // dereference directly
    }
}

カタログに戻る