Closed19

Kotlinスタートブック -新しいAndroidプログラミングを読んで

umiushiumiushi

第1章 ようこそKotlinの世界へ

2016年2月15日にバージョン1.0が正式リリース

umiushiumiushi

第4章 基本的な文法

  • Kotlinでは代入時に暗黙的な型変換は行わない仕様
  • raw string
    ※行頭に|記号を置いて目印にすることがあるらしい・・・
"""
    |It's
    |sunny
    |today
""".trimMargin()
  • 配列はArrayクラス
umiushiumiushi

第5章 関数

  • 可変長引数
fun demo(vararg params: String)

// 関数に配列を可変長引数として渡す場合
demo(*arrays)
  • 末尾呼び出し最適化
tailrec fun demo(arg) {
  // something process
  demo(....)
}
umiushiumiushi

第6章 第1級オブジェクトとしての関数

高階関数は柔軟に振る舞いを構築できる一方で呼び出しコストが高い傾向にある
オブジェクト生成に加えて、クロージャとして構築時の変数の補足をしなければならないため

インライン関数
inlineを付与した関数はコンパイル時にインライン展開されて実行時コストを抑えてくれる

  • noinline/crossinlineなるものもある
umiushiumiushi

第8章 クラスとそのメンバ

バッキングフィールド
プロパティに置いて実際の値を格納しておく場所
バッキングフィールドを持つプロパティは必ず初期化が必要

  • カスタムゲッター
    ※バッキングフィールドを持たない形でも定義可能
get() {
    return "value"
}
  • カスタムセッター
set(value) {
    field = value // fieldはバッキングフィールドを表す暗黙の変数
}
umiushiumiushi

第10章 インターフェース

Kotlinにおいては複数インターフェースからデフォルト実装を引き継いだメソッドが暗黙的に最も近い階層で定義された実装(メソッド)がコールされるというJavaのダイヤモンド継承問題が起きないように工夫されている

クラスデリゲーション
委譲におけるボイラーコード(同等メソッドの重複定義)を削減して、簡潔に記述できる

umiushiumiushi

第11章 ジェネリクス

上限境界

class<T: UpperBound> // UpperBoundのサブタイプに縛る

境界を複数指定したい場合はwhere

変位(variance)

  • 種類
    • 不変(デフォルト)
    • 共変(convarinat) = out
    • 反変(contravariant) = in
タイプ 修飾子 AがBのサブタイプだとして 可能な操作
不変 なし X<A>とX<B>の間に関係性はなし 入出力
共変 out X<A>はX<B>のサブタイプになる 出力
反変 in X<A>はX<B>のスーパータイプになる 入力
  • 型投影(type projection)
    型に対する可能な操作を制限すること

具象型のランタイム取得
本来はコンパイル時に消去されるジェネリクスの具象型をランタイム(特定の箇所)で取得する方法

inline fun <reified T>

※inline展開されることが必須条件

umiushiumiushi

第13章 その他の話題

sealed class
直和型=AかBか・・・・Nか

  • とりうる型候補を絞れる
  • Enumの実装差分を付けれるversionみたいなもの
umiushiumiushi

Appendix

kotlin-reflect
リフレクション不要アプリケーションのバイナリサイズ縮小のため別パッケージ?

このスクラップは2022/05/09にクローズされました