💭
Nested Class vs Inner Class
自分の技術メモをAIで記事化しているため、一部間違いがある可能性があります。ご了承ください。
✨ Nested ClassとInner Classとは?
Kotlinには「Nested Class」と「Inner Class」という2種類のクラススコープを制御する機能が用意されています。それぞれの目的や使い方、制約について見ていきましょう。
🔒 Nested Class
Nested Classは、親クラスに一切アクセスできない静的なクラスです。主にクラスの名前空間を整理するために使われます。
📝 制約
- 親クラスには一切アクセスできない
🎯 目的
- 論理的に意味のある階層構造を作ってクラスの名前空間を管理したい
💡 活用例
- DTO(Data Transfer Object)
- 定数
- Enum(列挙型)
🖥️ サンプルコード
class Button {
// Nested(static)クラス
class Style(
val backgroundColor: String,
val textColor: String
)
// Button 自体のプロパティ
var text: String = "Click me!"
// Button に適用するスタイルを外から受け取る
fun applyStyle(style: Style) {
println("Apply: bg=${style.backgroundColor}, text=${style.textColor}")
}
}
fun main() {
// Outer インスタンスとは独立して Style を生成できる
val darkStyle = Button.Style("#333", "#FFF")
val button = Button()
button.applyStyle(darkStyle)
}
🔗 Inner Class
Inner Classは、親クラスの関数やフィールドにアクセス可能なクラスです。親クラスのインスタンスに依存するロジックを実装する際に便利です。
📝 制約
- 親クラスの関数やフィールドにアクセス可能
🎯 目的
- あるクラスの中で、外側インスタンスに依存するロジックの塊をスコープを区切りながら実装することができる
💡 活用例
- Androidのイベントリスナで利用
🖥️ サンプルコード
class Playlist(private val name: String) {
private val songs = mutableListOf<String>()
// inner にすると this@Playlist にアクセスできる
inner class Editor {
fun addSong(song: String) {
songs += song // 外側のフィールドに直接アクセス
println("Added to $name: $song")
}
}
fun showSongs() = println("$name → $songs")
}
fun main() {
val playlist = Playlist("Morning Chill")
// Editor は playlist インスタンスにひも付く
val editor = playlist.Editor()
editor.addSong("Lofi Beat")
editor.addSong("Lo-Fi Study")
playlist.showSongs() // => Morning Chill → [Lofi Beat, Lo-Fi Study]
}
🔗 Nested ClassとInner Classの違いを比較
特徴 | Nested Class | Inner Class |
---|---|---|
親クラスへのアクセス | 不可 | 可能 |
主な目的 | 名前空間の整理 | 親クラスに依存するロジックの実装 |
活用例 | DTO、定数、Enum | Androidイベントリスナ、親子関係のロジック |
📚 参考リンク
Kotlin公式ブログや技術記事を参考にして、さらに理解を深めましょう。
Discussion