sealed class は継承できるクラスの種類を限定できる仕組みで、サブクラスは同じパッケージ・同じモジュール内で定義する必要があります。そのため when 式で使うと、すべてのサブクラスを網羅しているかをコンパイラが検査でき、else 節が不要になります。状態やAPIの結果を表す型を安全に表現する用途でよく使われます。
Kotlinのクラスは、Javaと異なりデフォルトで final となっており、継承するには open 修飾子を付ける必要があります。これは『継承のために設計されていないクラスは継承を禁じる』という Effective Java の指針に沿った設計です。メソッドやプロパティも同様にデフォルトで final であり、オーバーライドさせたい場合は open を明示します。
Q8 : Kotlinの変数宣言で、再代入ができない変数を宣言するキーワードはどれ?
Kotlinでは、val は読み取り専用の変数を宣言するキーワードで、一度値を代入すると再代入ができません。一方 var は再代入が可能な変数を宣言します。const は const val の形でコンパイル時定数に使い、final はJavaのキーワードでKotlinの変数宣言には使いません。不変性を意識したコードを書くため、基本は val を使うことが推奨されています。
data class を宣言すると、コンパイラが主コンストラクタのプロパティに基づいて equals()、hashCode()、toString()、copy()、componentN() を自動生成します。これによりボイラープレートコードを大幅に減らせます。ただし、データクラスには主コンストラクタに少なくとも1つのパラメータが必要で、プロパティは val か var で宣言する必要があるという条件があります。