【Kotlin】Kotlin ~ 基本編 / クラス ~

■ はじめに

https://dk521123.hatenablog.com/entry/2018/09/13/001546

の続き。
Kotlin の クラス や コンストラクタ を纏めていく。

結構、Javaと違う点が多い。いい変更もありますが。

目次

【1】クラス
 0)Javaとの違い
 1)data (データクラス)
 2)lateinit
 3)継承するには
 4)open
【2】コンストラクタ
 1)プライマリコンストラクタ
 2)セカンダリコンストラクタ
 3)初期化ブロック init
【3】可視性修飾子
【4】その他
 1)object
 2)コンパニオンオブジェクト (Companion Objects)
 3)Enum

【1】クラス

0)Javaとの違い

* Kotlinのデフォルトでは、Javaでのfinal classになる
 => 継承可能なクラス作成する場合は、「1)open」を利用

* Kotlin のプロパティでは、基本、明示的に初期化を書かないとエラー
 => 初期化できない場合は、「2)lateinit」を利用

1)data (データクラス)

* データを保持するためだけのクラス
* copy() など自動的に実装してくれる

https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/data-classes.html
https://qiita.com/kaleidot725/items/82510dde1082acddf8be
サンプル
https://dk521123.hatenablog.com/entry/2020/08/18/000000

data class Exam (
    val question: String,
    val answer: String
)

2)lateinit

* Late-Initialized properties (=遅延 初期化 プロパティ)
* 初期化を遅らせることができる

サンプル

// NG
// private var textNg:String

// OK
private lateinit var textOk:String

3)継承するには

* 「: [クラス名]()」で継承する

4)open

* 継承可能なクラスとして定義するには、open モディファイアを付ける
 * 以下の関連記事で実際に「RealmObject」を継承している。

https://dk521123.hatenablog.com/entry/2018/09/01/213649
サンプル

open class Comment: RealmObject() {

 【2】コンストラク

* コンストラクタ が2種類ある 
1)プライマリコンストラクタ
2)セカンダリコンストラクタ
 => 複数のコンストラクタを用いたい場合に使用

https://qiita.com/sdkei/items/4b773b662e34214b5261

1)プライマリコンストラク

class DemoClass(name: String) {
  val name: String = name
  // プライマリコンストラクタが呼び出されたときに実行される処理
  init {
    println(name)
  }
}

2)セカンダリコンストラク

class DemoClass(name: String) {
  val name: String = name
 
  // ★ ここ ★  
  constructor() {
  }
}

3)初期化ブロック init

class DemoClass() {
  init {
    // 初期化処理
  }
}

【3】可視性修飾子

https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/visibility-modifiers.html

1)private
2)protected
3)internal
4)public (※)

※ 明示的な修飾子がない場合は、public 

【4】その他

1)object

* classの代わりにobjectにすると、Singletonになる

https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/object-declarations.html#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E5%AE%A3%E8%A8%80
サンプル

object Sample {
    const val Hello_World = "Hello world"
}

2)コンパニオンオブジェクト (Companion Objects)

 * 一つのclassに対して、一つのcompanion objectしか定義できない
 * 定数(Javaのfinal static)や 静的なメソッドを定義する時に
 Companion Objectを利用
 => 定数に関する詳細は、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2020/08/12/000000
サンプル

class SampleClass {
  companion object {
    // Const
    // public
    const val KEY_OF_ID = "sample_id"
    // private
    val KEY_OF_NAME = "sample_name"

    @JvmStatic
    fun newInstance() : SampleClass {
      return SampleClass()
    }
  }
}

その他のサンプル

以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2020/07/27/000000
参考文献
https://qiita.com/kazhida/items/24ef7671f8ff7f3d74d6
https://qiita.com/tkhs0604/items/261e94a42b7097dfd204

3)Enum

以下の関連記事を参照のこと。

Kotlin ~ 基本編 / Enum・列挙型関連 ~
https://dk521123.hatenablog.com/entry/2020/08/10/125112

関連記事

Kotlin ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2018/09/13/001546
Kotlin ~ 基本編 / 変数・型・定数 ~
https://dk521123.hatenablog.com/entry/2020/08/12/000000
Kotlin ~ 基本編 / Enum・列挙型関連 ~
https://dk521123.hatenablog.com/entry/2020/08/10/125112
Kotlin ~ 基本編 / 配列・コレクション ~
https://dk521123.hatenablog.com/entry/2020/07/07/000000
Kotlin ~ 基本編 / 日付・時間 ~
https://dk521123.hatenablog.com/entry/2020/07/27/000000
Kotlin ~ 基本編 / スコープ関数 ~
https://dk521123.hatenablog.com/entry/2020/07/19/000000