データクラスとは?
データクラスの基本
データクラス(data class
)は、主にデータを保持するためのクラスであり、Kotlinで非常に便利な機能の一つです。通常のクラスとは異なり、データクラスはequals
、hashCode
、toString
、copy
、componentN
といったメソッドが自動的に生成されるため、データ管理が簡単になります。
data class User(val name: String, val age: Int)
fun main() {
val user1 = User("Alice", 25)
val user2 = User("Alice", 25)
println(user1 == user2) // 出力: true (データが同じなら等しいと判断される)
}
データクラスの主な特徴
equals
やhashCode
が自動生成され、オブジェクトの比較が簡単。toString
が自動生成され、オブジェクトの内容を簡単に表示可能。copy
メソッドで、オブジェクトを簡単に複製し、特定のプロパティのみ変更可能。componentN
メソッドを使用し、データの分解が可能。
val user3 = user1.copy(age = 30) // age だけ変更して新しいオブジェクトを作成
println(user3) // 出力: User(name=Alice, age=30)
データクラスの制約
データクラスにはいくつかの制約があります。
- プライマリコンストラクタに1つ以上のプロパティを持つこと。
- クラスは
abstract
、open
、sealed
、inner
のいずれかを持つことはできない。 - データクラスは継承できないが、インターフェースの実装は可能。
シールドクラス(sealed class)とは?
シールドクラスの基本
シールドクラス(sealed class
)は、特定のクラス階層を制限するためのクラスで、通常は状態の管理や分岐処理を簡潔に記述するために使われます。sealed
キーワードを使うことで、同じファイル内でのみ派生クラスを定義できるため、安全に型チェックを行えます。
sealed class Result {
class Success(val data: String) : Result()
class Error(val message: String) : Result()
}
fun handleResult(result: Result) {
when (result) {
is Result.Success -> println("Success: ${result.data}")
is Result.Error -> println("Error: ${result.message}")
}
}
シールドクラスの主な特徴
- 継承可能だが、派生クラスは同じファイル内に限定される。
when
式で型チェックを安全に行えるため、分岐処理が簡単になる。- データの状態を安全に管理できる。
シールドクラスの活用例
シールドクラスは、APIのレスポンスや状態管理に適しています。
sealed class NetworkState {
object Loading : NetworkState()
class Success(val data: String) : NetworkState()
class Failure(val error: String) : NetworkState()
}
fun handleNetworkState(state: NetworkState) {
when (state) {
is NetworkState.Loading -> println("Loading...")
is NetworkState.Success -> println("Data: ${state.data}")
is NetworkState.Failure -> println("Error: ${state.error}")
}
}
データクラスとシールドクラスの違い
比較項目 | データクラス | シールドクラス |
---|---|---|
目的 | データの保持 | 状態の管理や型制限 |
equals や copy | 自動生成される | 手動で実装する必要がある |
継承 | できない | できる(ただし同じファイル内に限定) |
when の使用 | 可能だが限定的 | when で型チェックが強力 |
データクラスは「データを保持するためのシンプルなクラス」として使い、シールドクラスは「特定の状態や振る舞いを管理するクラス」として活用するとよいでしょう。
まとめ
本記事では、データクラスとシールドクラスの基本と違いについて詳しく解説しました。
- データクラスは、データの保持に適しており、
equals
、copy
などが自動生成される。 - シールドクラスは、状態管理に適しており、
when
式を使った分岐処理が簡単に記述できる。
適切な場面でこれらの機能を使い分けることで、Kotlinのオブジェクト指向プログラミングをより効果的に活用できます。
次回は、Kotlinのコレクション操作と拡張関数について詳しく解説します!