おはようエンジニア

まともなエンジニアになりたい

『Kotlinイン・アクション』第4章を読む (その1)

Kotlinイン・アクションの第4章は「クラス、オブジェクト、インターフェイス」です。 それではいつものようにかいつまんで書いていきます。

インターフェイス

// インターフェイスの宣言
interface Clickable {
    fun showOff() = println("I'm clickable!")
}
// インターフェイスの実装
class Button : Clickable {
    // override修飾子必須
    override fun showOff() = println("I'm clickable button!")
}

アクセス修飾子

クラスの種類 オーバーライド インスタンス
class (default) 不可
open class
abstract class 不可
メソッドの種類 オーバーライド 実装の有無
fun (default) 不可
open fun
abstract fun

可視性修飾子

  • パッケージプライベートが廃止され、internal追加
  • internalはモジュール内で参照可能
    • モジュールは一度にコンパイルされるファイルのまとまり
修飾子 クラスメンバの参照範囲 トップレベル宣言時の参照範囲
public (default) どこからでも どこからでも
internal モジュール内 モジュール内
protected サブクラス内 -
private クラス内 ファイル内

ネストされたクラスと内部クラス

クラスの種類 外部クラスへの参照 Javaでの宣言 Kotlinでの宣言
ネストされたクラス 保持しない static class A class A
内部クラス 保持する class A inner class A
// Kotlinの内部クラスから外部クラスへのアクセス
class Outer {
    inner class Inner {
        fun getOuterReference(): Outer = this@Outer
    }
}

シールドクラス

  • 型チェックは シールドクラス内に取りうるサブクラスをすべてネストして列挙する
sealed class Expr {
    class Num(val value: Int) : Expr()
    class Sum(val left: Expr, val right: Expr) : Expr()
}
// 型チェック時に全てのケースをカバーできるのでelse分岐を取り除ける
when (e) {
    is Expr.Num -> ...
    is Expr.Sum -> ...
}

今回の内容はクラスの宣言方法、修飾子が中心でした。

修飾子についてはデフォルトで好ましい書き方となるようによく配慮されているように感じました。

次回はコンストラクタから見ていきます。