Kotlin は JVM バイトコードにコンパイルされ、Java と直接相互運用できます。さらに、null 安全性、簡潔な宣言、拡張関数、構造化並行処理を備えています。
クラスとコンストラクター #
クラスのヘッダーにはプライマリコンストラクターを 1 つ記述し、本体にはセカンダリコンストラクターを記述できます。プライマリコンストラクターのパラメーターは、val または var が指定されている場合にのみプロパティになります。初期化コードは init ブロックに記述します。
class Account(val id: String, initialBalance: Int) {
var balance = initialBalance
private set
init {
require(initialBalance >= 0)
}
constructor(id: String) : this(id, 0)
}セカンダリコンストラクターは、直接、または別のセカンダリコンストラクターを経由して、プライマリコンストラクターに委譲する必要があります。API を明確に表現できる場合は、プライマリコンストラクターとデフォルト引数の組み合わせを優先します。
拡張と null 許容性 #
拡張関数は呼び出し側ではインスタンスメソッドのように見えますが、静的に解決されるため、メンバーメソッドを実際にオーバーライドすることはできません。
fun String.initials(): String =
trim().split(Regex("\\s+")).joinToString("") { it.take(1) }Kotlin では、String と null 許容の String? が区別されます。Java 式の null 許容性に関する前提に頼るのではなく、安全呼び出し(?.)、Elvis 演算子(?:)、明示的なチェックを使用します。失敗させることが真に正しい契約である場合を除き、!! は避けます。
コルーチン #
suspend fun は、スレッドをブロックせずに中断できる関数を示します。低レベルの kotlin.coroutines パッケージは、CoroutineContext や Continuation などのプリミティブを定義します。kotlinx.coroutines ライブラリは実用的な API を提供しますが、別途追加する必要があります。
class UserService(private val api: UserApi) {
suspend fun load(id: String): User = api.fetch(id)
}処理は GlobalScope ではなく、構造化された CoroutineScope から起動します。Job はキャンセル可能な処理を表し、CoroutineDispatcher は実行スレッドを選択します。一般的なディスパッチャーには Dispatchers.Default と Dispatchers.IO があります。キャンセルは協調的に行われるため、中断関数の呼び出しやループで CancellationException を握りつぶしてはなりません。
CoroutineExceptionHandler は、ルートコルーチンで捕捉されなかった例外を報告するために使用し、通常のエラー処理には使用しません。子コルーチンの失敗とキャンセルは構造化並行処理の規則に従うため、ライフタイムが明示されます。
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)