クラス
Kotlinのクラス定義は次のようなイメージだ。
コンストラクタ
クラス定義とコンストラクタが一体化しており、コンストラクタの引数をクラス名の次に記述する。
1 |
class Sub(name:String,age:Int) { |
もし引数が不要な場合はシンプルに記述できる。
1 |
class Sub { |
プロパティ
Kotlinにはプロパティという概念がある。これはJavaのメンバー変数やgetter/setterに該当する。記述方法は変数の初期化と同様だ。
1 2 3 4 |
class Sub(name:String,age:Int) { var name1=name var age1 = age val country = "Japan" |
これら変数の初期化を行うことで、varの場合はgetter/setterメソッド、valの場合はgetterメソッドが生成される。これでひたすらgetter/setterメソッドを記述する苦行から解放されるというわけだ。
Javaでは引数をメンバー変数に転送する記述を行っていた。
1 2 3 4 5 6 7 8 9 10 |
public class Sub { String name1; int age1; String country="Japan"; Sub(String name,int age){ name1 = name; age = 10; } } |
Kotlinでは引数の代わりに変数定義することにより、プロパティの定義として扱われる。
1 |
class Sub(var name:String="山田",var age:Int=10,val country:String="Japan") { |
これで引数からプロパティへの転送が不要になり、簡潔なコードとなる。
nullを許与したくないが初期値がない!
nullを許容したプロパティはその後null判定を意識してコードを記述しなければいけない。面倒なのでnullが設定されないプロパティはnullを許容すべきでない。
しかし定義時に初期値が決定していないプロパティは困りものだ。初期値がないためnullを設定するとnullを許容していると見なされる(あたりまえか・・)。このため必要のないnull判定のコードを意識して記述しなきゃいけなくなる。面倒だ。
こんな時のために「lateinit」という命令がある。これを使うと初期化を後回しにできるのだ。これでnullにならなく初期値がないプロパティの定義ができる。
コンストラクタの処理
コンストラクタに処理を記述する場合は、initブロックを作成し、そこに記述する。
1 2 3 4 5 |
class Sub(var name:String="山田",var age:Int=10,val country:String="Japan") { init { Log.d("Sub",name+age+country) } } |
プログラム作成
ここまでの確認のためにクラスSubを作成し、利用側のコードをMainActivityに記述してみる。
画面右側のエクスプローラーからパッケージを選択し右クリック->New->Kotlin File/Classを選択。
パネルが開くのでClassを選択しクラス名(Sub)を入力
クラスSubに次の記述を行う。
1 2 3 4 5 6 7 |
package com.example.myapplication import android.util.Log class Sub(var name:String="山田",var age:Int=10,val country:String="Japan") { init { Log.d("Sub",name+age+country) } } |
MainActiviに11,12行を追加しクラスSubをインスタンス化、プロパティをログ出力する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.example.myapplication import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) var x = Sub("鈴木", 49) Log.d("MainActivity", x.name + x.age + x.country) } } |
1 2 |
D/Sub: 鈴木49Japan D/MainActivity: 鈴木49Japan |
クラスのインスタンス化ではNewが不要になった。
11 |
var x = Sub("鈴木", 49) |
プロパティにアクセスする際にはgetter/setterメソッドを呼び出すことなく、直接プロパティ名を記述すればよい。
12 |
Log.d("MainActivity", x.name + x.age + x.country) |
Javaの不満を解消するために登場した言語とあって、すっきりと記述できるようになった。
この他にgetter/setterメソッドのカスタマイズ、コンストラクタの追加などできるが、それは別途学習する。