0Pricing
Kotlin Academy · レッスン

sealed classとsealed interface:使い分け

Kotlinにおけるsealed classとsealed interfaceの違いを理解します。

「sealed classとsealed interface:使い分け」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

Kotlin の sealed 型

sealed class と sealed interface はクラス階層を既知のサブタイプに制限し、網羅的な when 式を使用できるようにします。

sealed class の基本

sealed class は、サブクラス化できる範囲を同じパッケージ(Kotlin 1.5 以降)または同じファイルに制限します。
sealed class Shape
class Circle(val radius: Double) : Shape()
class Rectangle(val w: Double, val h: Double) : Shape()
object Unknown : Shape()

sealed interface:より柔軟

sealed interface では、サブタイプが別のクラスを継承し、同時に別のインターフェースを実装できます。sealed class ではできません。
sealed interface Result<out T>
data class Success<T>(val value: T) : Result<T>
data class Error(val ex: Exception) : Result<Nothing>

主な違い

sealed class では、サブクラスがコンストラクターと状態を持てます。sealed interface では、サブタイプが任意のクラスを継承できます。より柔軟性が必要な場合は sealed interface を使用してください。
// sealed class subtype extends another class:
sealed interface Command
class MoveCommand(val dx: Int, val dy: Int) : Command, Serializable
class ResizeCommand(val scale: Double) : Command, Cloneable

網羅的な when:else は不要

すべての sealed サブタイプを網羅すると、when 式は網羅的になります。else は不要で、コンパイラーが完全性を検証します。
fun area(shape: Shape): Double = when (shape) {
    is Circle -> Math.PI * shape.radius * shape.radius
    is Rectangle -> shape.w * shape.h
}  // no 'else' — compiler guarantees completeness

サブタイプの追加で既存の when が壊れる

新しい sealed サブタイプを追加すると、既存の when 式は更新するまでコンパイルに失敗します。これが主な利点です。
// Add Triangle to Shape:
class Triangle(val base: Double, val height: Double) : Shape()
// Now the area() function above won't compile until
// a Triangle branch is added — safety net!

共通プロパティを持つ sealed class

共有するプロパティは sealed class で宣言してください。
sealed class NetworkResult {
    abstract val timestamp: Long
}
data class SuccessResult(val data: String, override val timestamp: Long) : NetworkResult()
data class FailureResult(val error: String, override val timestamp: Long) : NetworkResult()

ネストされた sealed 型

sealed サブタイプ自体を sealed にして、多段階の階層を構成できます。
sealed interface UiState
object Loading : UiState
sealed interface Loaded : UiState
data class Content(val items: List<String>) : Loaded
data class Empty(val hint: String) : Loaded
data class Failure(val error: String) : UiState

状態を持たないバリアントには object サブタイプ

状態を持たない sealed サブタイプには object を使用してください。
sealed class Direction
object North : Direction()
object South : Direction()
object East : Direction()
object West : Direction()

fun move(d: Direction) = when (d) {
    North -> y++
    South -> y--
    East -> x++
    West -> x--
}

sealed、data class、object の組み合わせ

sealed 型の下で、data class(状態を持つサブタイプ用)と object(シングルトン用)を組み合わせます。
sealed class LoadState
object Idle : LoadState()
object Loading : LoadState()
data class Success(val count: Int) : LoadState()
data class Error(val msg: String) : LoadState()

sealed class と interface の選び方

sealed class は、すべてのサブタイプが共通の状態を持つ場合に使用します。sealed interface は、サブタイプが異なる基底クラスを継承する必要がある場合や、他のインターフェースを実装する必要がある場合に使用します。

クイックチェック

sealed interface には sealed class に対してどのような利点がありますか?

まとめ

sealed class と sealed interface は階層を既知の型に制限します。sealed 型に対する when は網羅的になり、else は不要です。sealed interface では、サブタイプが他のクラスを継承できます。状態を持つサブタイプには data class を、状態を持たないサブタイプには object を使用してください。

よくある質問

「sealed classとsealed interface:使い分け」レッスンは無料ですか?

はい。「sealed classとsealed interface:使い分け」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「sealed classとsealed interface:使い分け」で何を学びますか?

Kotlinにおけるsealed classとsealed interfaceの違いを理解します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「sealed classとsealed interface:使い分け」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. sealed classとsealed interface:使い分け
  2. sealed階層を網羅するwhen
  3. Sealed ClassによるUI状態のモデル化
  4. Sealed階層のネストと組み合わせ
← Kotlin Academyに戻る