Kotlinハンズオンを読んで、Kotlinのコレクションとコンストラクタを整理します。
コレクション
コレクションはたくさんの値をまとめて管理するための仕組みで、いくつかの専用の値が用意されています。
配列
1 | arrayOf(value1, value2, …) |
配列は多数の値を保管する場所が用意されており、そこに1つ1つ値が保管されます。
保管されている場所にはインデックスと呼ばれる番号が付与され、これは0から順に割り振られます。また、配列の変数の後に.sizeをつけると要素数が取得できます。
配列の問題点
配列の欠点として型の異なる値を保管できないことが挙げられます。
また、配列は基本的に最初に用意した要素しか使えないようになっています。以下の例のように配列に新しい要素を追加することは基本的にできません。
1 2 3 | ex) var sampleArray = arrayOf(1, 2, 3, 4, 5) sampleArray[5] = 6 // エラー |
リスト
異なる値をひとまとめたり、要素を追加や削除をするにはリストを使います。
リストは配列と同じように多数の値を1つにまとめ、インデックスで整理します。このリストには「List」と「MutableList」の2種類があります。
ListとMutableListの違いは、リストの書き換えが可能かどうかの違いです。
Mutableとは「可変な」という意味で、MutableListは要素の追加や削除、入れ替えなどができます。一方、Listは読み取り専用で要素を変更することができません。
Listの作成
1 | listOf(value1, value2, …) |
MutableListの作成
1 | mutableListOf(value1, value2, …) |
マップ
マップは保管する値にキーというラベルをつけて保管します。このマップもリストと同様、値の変更ができない定数扱いの「Map」と変更できる「MutableMap」が用意されています。
マップにはインデックスがないため、リストのように作成した順番に値を取り出すということができません。
Mapの作成
1 | mapOf(key1 to valu1, key1 to value2, …) |
MutableMapの作成
1 | mutableMapOf(key1 to valu1, key1 to value2, …) |
セット
セットは集合を扱う値で、集合のため同じ値は複数存在できません。また、値に順番などもありません。
これも変更できない定数としての「Set」と変更可能な「MutableSet」が用意されています。
Setの作成
1 | setOf(valu1, value2, …) |
MutableSetの作成
1 | mutableSetOf(value1, value2, …) |
ジェネリック(総称型)
コレクション関係の値を用意する際に、この方の値だけ入れられるということを設定できる仕組みがジェネリックと呼ばれるものです。
これは、値を作成する際に<>記号を使って型を指定します。以下のように<型>とつけることで、そのコレクション内に指定された型の値しか保管できなくなります。
1 | 変数 = listOf<型>() |
クラスのコンストラクタ
プライマリコンストラクタ
インスタンスを作成する際に使用する引数は、クラス定義に引数を用意しておくことで利用できるようになります。この引数はプライマリコンストラクタと呼ばれ、その名の通りインスタンスをコンストラクタするためのものです。
1 | class 名前 (arg1, arg2, …) |
initメソッド
initメソッドでクラスに初期化処理を用意して処理させることができます。このinit内で、クラスの引数に用意された値などを元に初期化の処理をします。
1 | init { 初期化処理 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | ex) class Person(name: String=”no name”, address: String=”no address”) { var name: String var address: String init { this.name = name this.address = address } fun say() = “Name: ” + name + “, Address: “ + address } |
プライマリコンストラクタの引数をプロパティに代入するだけならinitメソッドを使わなくとも行うことができます。値をプロパティに代入するだけで他に何も処理を行わないなら以下のように直接代入した方が簡単にできます。
1 2 3 4 5 6 7 8 | ex) class Person(name: String=”no name”, address: String=”no address”) { var name = name var address = address fun say() = “Name: ” + name + “, Address: “ + address } |
constructorメソッド(セカンダリコンストラクタ)
プライマリコンストラクタよりもっと柔軟に引数を用意できる仕組みがconstructorメソッドです。このconstructorはセカンダリコンストラクタと呼ばれ、使用するにはプライマリコンストラクタ(クラス宣言の引数とinit)は使えません。
1 | constructor(args) { … } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ex) class Person { var name: String var address: String constructor(name: String=”no name”, address: String=”no address”) { this.name = name this.address = address } constructor(arr: Map<String, String>) { this.name = arr[“name”] ?: “no name” this.address = arr[“address”] ?: “no address” } fun say() = “Name: ” + name + “, Address: “ + address } |