2016-11-05 4 views
8

コットリンはゲッターと設定を自動生成しますが、決してそれらを参照しませんか?また、Kotlinでカスタムゲッタ/セッタを書く正しい方法は何ですか?私がmyObj.myVar = 99と言ったら、myVarは私が直接アクセスしているmyObjの公開フィールドですか?ここで実際に何が起こっていますか?Kotlin - ゲッターとセッターを理解する

+0

[Gettters and Setters in Kotlin]の複製があります(https://stackoverflow.com/questions/37906607/getters-and-setters-in-kotlin) – Bharatesh

答えて

16

これは、いくつかの場所で回答されているが、私は、私は、Java/C#の/ C/C++からKotlinへ移行する人のための具体的な例を共有するだろうと思った、と誰が私は同じ質問を持っていた:

私はgetterとsetterがKotlinでどのように働いていたか、特に明示的に呼び出されていない(Javaのように)方法を理解するのが難しかった。このため、フィールドとしてヴァルス/ヴァルを直接引用しているように見えたので、私は不快感を感じました。そこで、私はこれが当てはまらないことを実証するために少し実験を行いました。実際には、変数/値にアクセスするときにKotlinで呼び出される暗黙の(自動生成の)ゲッター/セッターです。違いは、デフォルトゲッタ/セッタを明示的に要求していないことです。 documentationから

- プロパティを宣言するための完全な構文は次のとおりです

var <propertyName>: <PropertyType> [= <property_initializer>] 
    [<getter>] 
    [<setter>] 

そして、私の例では、私はそれがいくつか他の人のために一緒にそれをすべて持って来るのに役立ちます願っています

class modifiersEg { 

/** this will not compile unless: 
*  - we assign a default here 
*  - init it in the (or all, if multiple) constructor 
*  - insert the lateinit keyword */ 
var someNum: Int? 
var someStr0: String = "hello" 
var someStr1: String = "hello" 
    get() = field // field is actually this.someStr1, and 'this' is your class/obj instance 
    set(value) { field = value } 

// kotlin actually creates the same setters and getters for someStr0 
// as we explicitly created for someStr1 

var someStr2: String? = "inital val" 
    set(value) { field = "ignore you" } 

var someStr3: String = "inital val" 
    get() = "you'll never know what this var actually contains" 

init { 
    someNum = 0 

    println(someStr2) // should print "inital val" 

    someStr2 = "blah blah blah" 
    println(someStr2) // should print "ignore you" 

    println(someStr3) // should print "you'll never know what this var actually contains" 
} 

のですか?

+0

私はそれがまさに初心者フレンドリーではないことを知っていますが、委任されたプロパティなど、より複雑なプロパティ関連の機能の場合は、Kotlinバイトコードインスペクタを使用することを強くお勧めします。 someStr0小道具、ゲッター、セッターの – daemontus

+0

の表示範囲は何ですか?この例では、すべてのプロパティはpublic(デフォルト)です。私が私的なプロパティを持っていると、これはうまく動作しますか?私はJavaの開発者であることに慣れています。 –

+0

プライベート変数に 'getter'と' setter'を使うにはどうすればいいですか? – viper

関連する問題