2024-12-05 00:08:43 +09:00
なんか勝手にシングルトンになるらしい。わりと便利
Rustでいう所のenum的な?代数的データ型らしい。非常に便利
whenで取り出すときはis SealedClass.SubClass -> { /*...*/ }
で出せて、勝手に型も合わせておいてくれるらしい。めっちゃ便利 乱用したい
sealed classを定義する際にコンストラクタを一緒に定義しておくことで内部のdata classにもそのプロパティを継承させることができるっぽい。sealed class hoge(private val fuga: String)
の内部にdata class piyo(): hoge(fuga = "1234")
を作るみたいな感じで。IDとかの共通な部分はこれで定義しておくと何かと良さそうではある
-> この共通部分はコンストラクタで作れない?っぽい。わからん 後で詳しく仕様読みたい
sealed classの入ったListから特定のdata classのみを選びたい場合はfilterIsInstance<T>()
を使う。これ大好きかもしれん
switchとかmatchな感じの文?あとでhttps://qiita.com/yamadacsa/items/d3dc544da15f9ba52760読んでおく
when (val x = hogehoge()) { /*...*/ }
とするとwhenブロックの中でのみ有効な一時変数を定義できる。スマートキャストが効かない場合にこうやって一時変数に代入してあげることでキャストできる。良いのかは知らん
可変長引数。fun sum(vararg i: int): int
みたいな定義をするとiがなんか配列っぽい感じに扱えるっぽい?ぽいぽい
スゲー便利そうだけど実際に実装する時に使うイメージは浮かばない
List*
演算子で展開してあげるといいらしい、面白……
パターンマッチではない
Nullableな型に対して?.let { it -> /*...*/ }
とすることでnullでない場合のみスコープ内の処理をやってくれるらしい。Option
インスタンスに対して.apply { /*...*/ }
ってやるとインスタンスの設定とかできるっぽい?val a = hoge(); a.setStatus("fuga")
みたいなのをval a = hoge().apply{ setStatus("fuga") }
に圧縮できるみたいな……?スコープ関数わからん。でも便利
runCatching { /* 失敗するかも処理 */ }
.onSuccess { /* 成功時 */ }
.onFailure { /* 失敗時 /* }
みたいな書き方でtry~catch構文的なエラーハンドリングが出来るらしい。まだ使ったことないけどResultに包むまでもない処理ならこれでよさそう
getOrNull()
で例外握りつぶすこともできる。Option::ok()
に近い感覚で使えそうで一気に便利度が増した
fun <T> hogehoge(fuga: T)
みたいな構文?
ジェネリクスの概念Rustで学んでしまった影響で構造体とかトレイトって単語が脳内をよぎるようになってしまったけど概ねKotlinも同じ使い方が出来そう。<T: hoge>
とかwhere句で制約可
ジェネリクスに<reified T>
みたいにつけてあげると関数内でTの型を扱えるようになるらしい?ただし関数はinline
で定義されている必要がある
コードの最適化がどうたら
ない。現実は非情である
たとえばfun String.hoge() { /*...*/ }
と書くとStringクラスに対してhogeメソッドが実装される。ひたすらに便利。他の言語にもこの仕様くれ
for (index in 0 until count) { /*...*/ }
と等価?記述量少なくて非常に便利そう
mapOf
を使う。"KEY" to "VALUE"
のような記法。オモロ…