初心者用kotlin

kotlinのメモです。

1178 views

基本

クラスの書き方の基本サンプル。

class Person() {
    var name = "konishi"
    var age = 41

    fun show() {
        println("${name}は${age}歳です")
    }
}

fun main(args:Array<String>){
    var p = Person()
    p.show()
}

setter

まずは、メンバ変数ageに100を代入するコードを以下に記す。12行目で100を代入し、13行目で表示すると、
konishiは100歳ですと表示される。

class Person() {
    var name = "konishi"
    var age = 41

    fun show() {
        println("${name}は${age}歳です")
    }
}

fun main(args:Array<String>){
    var p = Person()
    p.age = 100
    p.show()
}

18未満をageに設定したときにエラーにしたい場合はどうしたらよいか。
一つはageをプライベート変数にして外部から代入できないようにし、かつ、setAge関数を作成する。
そして、setAgeに値を代入したときにエラーにすればよい。
これはC++、java風の書き方。

import java.lang.IllegalArgumentException

class Person() {
    var name = "konishi"
    private var age = 41

    fun setAge(age:Int) {
        if(age < 18) {
            throw IllegalArgumentException("18歳未満は入場できません")
        }
        this.age = age
    }
    fun show() {
        println("${name}は${age}歳です")
    }
}

fun main(args:Array<String>){
    var p = Person()
    p.setAge(17)
    p.show()
}

こういう、メンバ変数に外部から直接アクセスさせず、関数経由で値を渡す方法をsetterと呼ぶ。
しかし、C++、javaではメンバ変数の数だけset関数を作成しなければならず、面倒というのがあった。
自分もよく、「もう、public変数でよくね?」なんて言っていた。
「変な値入れられた困るやん」と言われたものだが、正直、変な値を入れる時点で動かないんだから、誰も得しないと思うのだけど。

で、このメンドクサイ、をちょっと解消しているのがkotlinのsetter。
上記コードは以下のように書ける。

import java.lang.IllegalArgumentException

class Person() {
    var name = "konishi"
    public var age = 41
    set(age:Int) {
        if(age < 18) {
            throw IllegalArgumentException("18歳未満は入場できません")
        }
        field = age
    }
    fun show() {
        println("${name}は${age}歳です")
    }
}

fun main(args:Array<String>){
    var p = Person()
    p.age = 17
    p.show()
}

age変数の直下、6行目でsetを書くと、これがsetter関数になる。
そして、19行目、メンバ変数に値を直接代入すると、自動的にsetが呼ばれ、IllegalArfumentExceptionを返してくれる。
変数に値を代入しただけで例外が飛んでくるのは、良いのか悪いのかというと…。
catchする側は大変ですね。今どきは、こーなのか。
なお、8行目、setter内のfeildはバッキングフィールドと呼び、ageと同じ意味である。
じゃあ、以下のように書いてもいいのか?というと、それはNG。

    set(age:Int) {
        if(age < 18) {
            throw IllegalArgumentException("18歳未満は入場できません")
        }
        this.age = age
    }

5行目で値を代入しているわけだが、ここでsetが呼ぶ。つまり、ageに値を代入しようとしたら、5行目でsetが呼ばれ、setが呼ばれるため、また1行目から処理が走り、
set→set→set→set→set→set…と関数がコールされ続け、スタックオーバーフローが発生する。

Page 4 of 36.

前のページ 次のページ



[添付ファイル]


お問い合わせ

プロフィール

マッスル

自己紹介

本サイトの作成者。
趣味:プログラム/水耕栽培/仮想通貨/激辛好き
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
仮想通貨はNEMが好き。
水耕栽培は激辛好きが高じて、キャロライナ・リーパーの栽培にチャレンジ中。

サイト/ブログ

https://www.osumoi-stdio.com/pyarticle/

ツイッター

@darkimpact0626