pragmatic, i.e., being a programming language useful for day- to-day development, which helps the users get the job done via its features and its tools. 8 Kotlinの思想_1 | 題材の仕様確認 Kotlinには、多様な状況に対応できるよう⾔語仕様が豊富に⽤意されています。 ⼀⽅で、リリースサイクルも早く、⾔語機能が豊富であるがゆえ、使い⽅がわかりづらいものも... 簡潔、安全、Javaとの 相互運⽤性 Concise, Safe, Interoperable ifやtry-catchなどの制御構⽂ が式であるなど、⼿続き 的‧宣⾔的なパラダイムを 柔軟に選択できる 巨⼤なJavaのモノレポを運 ⽤しているGoogleでも、 Kotlinがサーバサイドの推奨 ⾔語に Kotlin
class を拡張したような機能で、複数の 継承したクラスを持つことができます。 A sealed class is implicitly abstract (and these two modifiers are exclusive); リファレンスによると、 値が制限されたセットの1つの型を持つが、他の型を持てない場合、 シールクラスが制限されたクラス階層を表現する際に⽤いられます。 sealed class Expression { data class IntegerLiteral( val value: Int ) : Expression() data class ArrayLiteral( val items: List<Expression> ) : Expression() data class FunctionCall( val name: String, val args: List<Expression> ) : Expression() } 本セッションで取り扱う、sealed class(/interface) を概観しておきます。 ※なお、Javaでも17から正式な機能にsealed classが追加され、この点における機能差は⼩さくなりました。
val id: String, val paymentState: PaymentState, val amount: Amount, val items: Map<Item, Quantity>, val orderedAt: LocalDateTime ) { fun needToRequest() = this.paymentState.needToRequest() fun getRemainedAmount(): Amount = when (paymentState) { is PaymentState.NotPayed -> amount is PaymentState.UnderPayment -> { val v = amount.value - paymentState.payedAmount.value Amount(v) } is PaymentState.OverPayment -> Amount(0) is PaymentState.Done -> Amount(0) } } 簡易ドメインモデル上の、 「注⽂」を実装する。
val id: String, val paymentState: PaymentState, val amount: Amount, val items: Map<Item, Quantity>, val orderedAt: LocalDateTime ) { fun needToRequest() = this.paymentState.needToRequest() fun getRemainedAmount(): Amount = when (paymentState) { is PaymentState.NotPayed -> amount is PaymentState.UnderPayment -> { val v = amount.value - paymentState.payedAmount.value Amount(v) } is PaymentState.OverPayment -> Amount(0) is PaymentState.Done -> Amount(0) } } 簡易ドメインモデル上の、 「注⽂」を実装する。 sealed classである PaymentState をフィール ドに持つ。 PaymentState を使った計 算ロジックを持つ。
getRemainedAmount(): Amount = when (paymentState) { is PaymentState.NotPayed -> amount is PaymentState.UnderPayment -> { val v = amount.value - paymentState.payedAmount.value Amount(v) } is PaymentState.OverPayment -> Amount(0) is PaymentState.Done -> Amount(0) } 注⽂エンティティから、⽀ 払い状況に応じて催促する 残額を計算する。
-la total 48 drwxr-xr-x 10 user group 320 10 11 13:00 . drwxr-xr-x 6 user group 192 10 11 13:00 .. -rw-r--r-- 1 user group 2199 10 11 13:00 Amount.class -rw-r--r-- 1 user group 1011 10 11 13:00 PaymentState$Done.class -rw-r--r-- 1 user group 1023 10 11 13:00 PaymentState$NotPayed.class -rw-r--r-- 1 user group 3083 10 11 13:00 PaymentState$OverPayment.class -rw-r--r-- 1 user group 3090 10 11 13:00 PaymentState$UnderPayment.class -rw-r--r-- 1 user group 1478 10 11 13:00 PaymentState.class 親である PaymentState と同じパッケージに、ネストされたサブクラスのクラスファイルができることが わかります。 ※以下はKotlinソースから、コンパイルした結果を端末上で ls した結果です。
"PaymentState.kt" public abstract class io.github.simonnozaki.tinypayer.domain.PaymentState { public abstract boolean needToRequest(); public io.github.simonnozaki.tinypayer.domain.PaymentState(kotlin.jvm.internal.DefaultConstructorMark er); } PaymentState は public abstract class となっていることが確認できます。 ※シェルから持ってきた出⼒ですが、わかりやすさのためキーワードはシンタックスハイライトを⼊れています。
classes - https://kotlinlang.org/docs/sealed-classes.html JEP 409: Sealed Classes - https://openjdk.org/jeps/409 JEP 433: Pattern Matching for switch (Fourth Preview) - https://openjdk.org/jeps/433 Creating The Best Programming Language: The Story of Kotlin - https://youtu.be/uE-1oF9PyiY Google's Journey from Java to Kotlin for Server Side Programming by James Ward , Brad Hawkes , John - https://youtu.be/o14wGByBRAQ