#Kotlin マイルストーン3 予告!多重宣言とデータクラス
久々にKotlin公式ブログの更新がありました!
How do you traverse a map? | Project Kotlin
まもなく発表されるマイルストーン3 (M3) で導入される新機能の一部が紹介されています。その新機能は多重宣言 (Multi-declarations)とデータクラスです。この両機能は現行のタプルに取って代わる機能です。
多重宣言
多重宣言をよく使うことになるであろうシーンは、キーバリューペアのイテレートです。
for((key, value) in map) { println("$key : $value") }
Map型の変数mapに対して繰り返し、要素を取り出しています。取り出される要素はキーとバリューの2つですが、それらを受け取る変数が2つ用意されています。変数keyと変数valueです。
これがKotlinの多重宣言です。
この多重宣言を可能にしている仕組みは、複数の値を返す機能をもった型です。先の例ではMap型ですね。
多重宣言機能により複数の値を返すには、関数 component*()を提供する必要があります。*の部分は任意の整数です(上限はあるのかな?)。
例えば次のようなクラスは、多重宣言に対応した型と言えます。
class Person(val name : String, val age : Int) { fun component1() = name fun component2() = age }
関数 component*()は、拡張関数として定義しても問題ありません。
データクラス
OOPを行う上で、プロパティのみを持ち、特別な操作(メソッド等)がないクラスがしばしば必要になります。そのような場合Javaでは、退屈なコードを何十行も書く必要がありました(フィールドやアクセサメソッド等)。
Kotlinでは簡単にそのようなクラスを記述できます。次のクラスはnameとageというプロパティとコンストラクタのみを持ったクラス定義です。
class Person(val nage : String, val age : Int)
簡単ですね。
そして、さらにデータクラスを簡単に定義できるdataアノテーションが追加されました。このdataアノテーションを付けたクラスには、自動的に関数 component*()が生成されます。コンストラクタで宣言したプロパティの順に component*()が生成されます。
data class Person(val name : String, val age : Int) fun main(args : Array<String>) { val persons = LinkedList<Person>() persons.add(Person("hoge", 20)) persons.add(Person("fuga", 30)) persons.add(Person("piyo", 40)) for ((name, age) in persons) { println("$name is $age years old.") } }
このコードを実行すると、次のように出力されます。
hoge is 20 years old. fuga is 30 years old. piyo is 40 years old.
現時点ではまだ実装されていませんが、今後はcomponent*()の他にtoString()やequals()等もdataアノテーションにより自動生成されるらしいです。
M3からタプル機能は削除されますが、関数から複数の値を返したいときにはデータクラスを使用することになります。