拡張性ってナンダ
どうもReoです。
ある時、このメソッドもっとこういう処理が追加されると、今作っているアプリ内でとっても便利なぁと思う場面が出てきました。
当然、それをメソッド内でそれを定義すればよいだけの話なのですが、可読性が落ちがちです。
その為、メソッドをその場で最適化した振舞をするように定義したいなと思うわけです。
そこで、拡張性を活かす次第です。
ちなみに、Extensionとも言います。
拡張というのは、「性能向上」とすぼめて換言出来ますね。
筆者は、すぼめて理解、覚えるのが好きなんですw
kotlinでは、既存のクラスを拡張性を踏襲した拡張関数なるものを作りやすい特徴があるようです!
折角、kotlinというモダンな言語を学習しているのですから、是非とも使いたいですね。
使ってみよう
何を作ってみましょうか。
その前に、キーワードを確認しておきます。
レシーバ:
拡張する元となるオブジェクトの事です。MutalbeListのメソッドを拡張するとしたら、MutableListが「レシーバ」となります。
「拡張元」と覚えると良いかなと。
それでは、Kotlinのリファレンスにて、拡張の記事があるのでそれを参考にしてみましょう。
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1] // 'this' がリストに対応する
this[index1] = this[index2]
this[index2] = tmp
}
記事では、MutableListには、本来ないswapという要素を入れ替えるメソッドを定義しています。
拡張関数を定義するときは、リファレンス内にもあるように、レシーバをメソッド前に宣言します。
そこから、書き始めます。
ちなみに、拡張関数はこれで完成です。
実際に使ってみましょう。
glot.ioというサイトを用いるとさくっとコードが書けます。
fun main(args : Array<String>){
val m = mutableListOf(1,2,3)
m.swap(0,2)
println(m)
}
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1] // 'this' がリストに対応する
this[index1] = this[index2]
this[index2] = tmp
}
// 結果:[3, 2, 1]
なんと、swapという処理があたかも静的なメソッドとして使えるではありませんか!
また、リファレンス内に
拡張は 静的 に解決される
とありますが、これは実際にクラスを根本的に変えているのではなくて、拡張関数をオブジェクトから呼び出せるようにしているだけだよ!みたいなことをいってます。
また、レシーバをnull許容にすることもできるみたいですね。
拡張関数内で、ヌルチェックを記述することで、呼び出しがスマートになりますね!
拡張プロパティなるものもあるみたいです。
使い道が良く分からんですがw
これ以上、リファレンス掘り下げると頭がパンクしそうなので、切り上げましょう。
拡張関数が「性能向上」
レシーバが「拡張元」
これさえ、覚えておけば実装出来ると思います!
終わり
意外と、簡単でしたね。
プログラミングは、実際の内容よりも難しく感じる用語が多いので、気を付けないとですね笑。