kotlinのメモです。
1398 views
クラスの書き方の基本サンプル。
class Person() {
var name = "konishi"
var age = 41
fun show() {
println("${name}は${age}歳です")
}
}
fun main(args:Array<String>){
var p = Person()
p.show()
}
まずは、メンバ変数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。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/