LoginSignup
1
0

DartとKotlinのsealed classを比較してみた

Posted at

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));
}

実行結果
スクリーンショット 2024-03-28 23.14.30.png

🦜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")
    }
}

実行結果
スクリーンショット 2024-03-28 23.17.04.png

まとめ

DartとKotlinのsealed classを比較してみましたが、Kotlinの方がシンプルでわかりやすい気がしました。DartだとJavaぽくなるので、見づらいのかもですね。色々探求してみたい。新しい文法が出てきても他の人が読みやすいコードを書きたいな....

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0