はじめに
Androidのネイティブ開発をKotlinで担当することになり、備忘録も兼ねて投稿します。
Kotlinの動作確認は下記で行うのが楽です。
https://developer.android.com/training/kotlinplayground?hl=ja
目次
コンストラクタ
インスタンス生成時に自動で呼び出されるメソッド的なもの。
Kotlinには2種類のコンストラクタがある。
・プライマリコンストラクタ
・セカンダリコンストラクタ
プライマリコンストラクタ
クラスに1つしか持てない。
クラスのヘッダの一部でクラス名(型パラメータはつけること可能)の後に続けて書く。
class クラス名 constructor(引数名: データ型) {}
プライマリコンストラクタがアノテーションや可視性修飾子を持ってない場合は、constructorのキーワードは省略可能。
class クラス名(引数名: データ型) {}
プライマリコンストラクタは、コードを含めることはできない。
初期化を書きたい場合はinit キーワードを付けて、ブロック内に書く。
class クラス名(引数名: データ型) {
init {
logger.info("プライマリコンストラクタの初期化です。${引数名}も使えます")
}
}
クラス本体の中で宣言されたプロパティの初期化処理でも使える
class クラス名(引数名: String) {
val プロパティ名 = 引数名.toUpperCase()
}
fun main() {
val test = クラス名("a")
println(test.プロパティ名)
}
Aが出力される。
プロパティの宣言と初期化をプライマリーコンストラクタから行なう簡潔な構文がある。
class クラス名1(
val プロパティ名1: データ型,
val プロパティ名2: データ型
) {
}
//{}も処理がなければ省略できる
class クラス名2(val プロパティ名1: データ型, val プロパティ名2: データ型)
//デフォルト値も設定できる
class クラス名3(var プロパティ名: String = "test")
fun main() {
//デフォルト値を指定したもの
val test1 = クラス名3()
val test2 = クラス名3("てすと")
println(test1.プロパティ名)
println(test2.プロパティ名)
}
/*
出力は下記
test
てすと
デフォルト値を設定した場合、インスタンス時の引数(プロパティ)は省略できる
*/
プロパティはプライマリーコンストラクタの中で可変値(var)、固定値(val)で宣言できる。
セカンダリコンストラクタ
クラス本文内にconstructorを書けばセカンダリコンストラクタを宣言できる。
セカンダリコンストラクタは複数持つことができる。
プライマリコンストラクタがない場合
class クラス名 {
constructor(引数名: データ型)
}
複数書いた場合
class クラス名 {
constructor(str: String) {
println("文字列の引数のコンストラクタだよ")
}
constructor(int: Int) {
println("数値の引数のコンストラクタだよ")
}
}
fun main() {
val test1 = クラス名("a")
val test2 = クラス名(1)
}
引数のデータ型の違いなど、複数かける。
プライマリコンストラクタとセカンダリコンストラクタがある場合
セカンダリコンストラクタは直接か他のセカンダリコンストラクタを介して
プライマリコンストラクタへ委譲する必用がある
同じクラスならthisが使える
class クラス名(str:String, int: Int) {
constructor(str: String) : this(str, 1) {
println("セカンダリコンストラクタ通ったよ")
println("引数strは${str}です")
}
}
fun main() {
val test1 = クラス名("a")
val test2 = クラス名("b", 1)
}
実行結果は下記
セカンダリコンストラクタ通ったよ
引数strはaです