sealed classを違う言語同士で比較してみた!
Dartを書くことが多いけど、sealed classを使う機会がない...
Kotlinや他の言語は、昔からsealed classがあるらしい?
どっちが書きやすいのだろうか、気になって書いてみた。コード書くの好きなのでついつい気になってしまう。
🎯Dart
Dart3.0から、sealed classが使えるようになった。Fruit
というsealed classを定義して、継承してApple
,Banana
,Orange
を作ってみた。簡単すぎて参考にならないかもだけど、いきなりロジックを考えるより、動くものを作って試してから、アプリのロジックに使った方がいいかなと思っていつもサンプルコードを書くところから始めます。
sealed class Fruit {}
class Apple extends Fruit {
final String name;
Apple(this.name);
}
class Banana extends Fruit {
final String name;
Banana(this.name);
}
class Orange extends Fruit {
final String name;
Orange(this.name);
}
String whenFruit(Fruit fruit) => switch(fruit) {
Apple() => 'りんご',
Banana() => 'バナナ',
Orange() => 'オレンジ',
};
void main() {
final fruit = Apple('りんご');
print(whenFruit(fruit));
}
🦜Kotlin
Kotlinだと昔からseald classがあるみたい。Enumみたいな使い方ができたりするようです。クラスの継承を制限する目的で使うから、別もんでしょうけど、Dartと同じようなロジックを書くとこんな感じです。
// 果物っていうインターフェースを作って、その中にApple, Banana, Orangeを作る
sealed interface Fruit
// interfaceを継承しているので、これはFruitの実装クラス
sealed class Fruits() : Fruit
// sealed classを継承して、3つのオブジェクトを作っている
data object Apple : Fruits()
data object Banana : Fruits()
data object Orange : Fruits()
fun main() {
// whenに渡す変数の型をFruitにしている。Appleというオブジェクトを代入している
val fruit: Fruit = Apple
// whenの中で、Fruitの型によって処理を分けている
when (fruit) {
// whenの中では、isを使って型を判定している。->の後に処理を書く
is Apple -> println("Apple")
is Banana -> println("Banana")
is Orange -> println("Orange")
}
}
まとめ
DartとKotlinのsealed classを比較してみましたが、Kotlinの方がシンプルでわかりやすい気がしました。DartだとJavaぽくなるので、見づらいのかもですね。色々探求してみたい。新しい文法が出てきても他の人が読みやすいコードを書きたいな....