0Pricing
Kotlin Academy · レッスン

companion object:Kotlinで静的メンバーのように使う

クラスにcompanion objectを追加し、staticメソッドや定数に相当する機能を実現します。

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

static はないが companion object がある

Kotlin にはstaticキーワードがありません。代わりに、クラス内で宣言したcompanion objectが、クラスレベルの(static のような)メンバーを提供します。

companion object の宣言

クラス内にcompanion objectを配置します。そのメンバーはClassName.memberとして呼び出せます。

class MathUtils {
    companion object {
        fun square(x: Int) = x * x
    }
}
fun main() {
    println(MathUtils.square(5)) // 25
}

companion object の定数

定数は通常 companion object に配置し、コンパイル時リテラルにはconst valを使用することがよくあります。

class HttpClient {
    companion object {
        const val DEFAULT_TIMEOUT = 5000
        const val USER_AGENT = "MyApp/1.0"
    }
}
fun main() {
    println(HttpClient.DEFAULT_TIMEOUT)
    println(HttpClient.USER_AGENT)
}

名前付き companion object

companion object には名前を付けることができます。ClassName.memberとClassName.CompanionName.memberのどちらも使用できます。

class Database {
    companion object Factory {
        fun create() = Database()
    }
}
fun main() {
    val db1 = Database.create()       // works
    val db2 = Database.Factory.create() // also works
    println("$db1 / $db2")
}

ファクトリメソッドパターン

検証や別の生成ロジックを伴うインスタンスの作成には、コンパニオンオブジェクトを使用します。

class User private constructor(val name: String, val email: String) {
    companion object {
        fun create(name: String, email: String): User {
            require(email.contains("@")) { "invalid email" }
            return User(name, email)
        }
    }
}
fun main() {
    val u = User.create("Ada", "ada@example.com")
    println("${u.name} <${u.email}>")
}

インターフェースの実装

コンパニオンオブジェクト自体にインターフェースを実装できます。静的メンバーのような契約を必要とするクラスと組み合わせる場合に便利です。

interface Loadable<T> { fun load(): T }
class Config(val data: String) {
    companion object : Loadable<Config> {
        override fun load() = Config("loaded data")
    }
}
fun main() {
    println(Config.load().data)
}

Java連携のための@JvmStatic

コンパニオンオブジェクトのメンバーに@JvmStaticアノテーションを付けると、Javaから呼び出す際に真のstaticメソッドとして公開できます。

class Util {
    companion object {
        @JvmStatic
        fun greet(name: String) = "Hello, $name!"
    }
}
fun main() {
    println(Util.greet("Kotlin"))
    // In Java: Util.greet("Java")
}

コンパニオンオブジェクト自体へのアクセス

ClassName.Companionは、コンパニオンオブジェクトを直接参照します。引数として渡す場合に使用します。

class Counter {
    companion object {
        fun greet() = "hi from companion"
    }
}
fun main() {
    val ref = Counter.Companion
    println(ref.greet())
}

コンパニオンオブジェクトとトップレベル関数

クラスに属さないユーティリティ関数には、コンパニオンオブジェクトだけを持つクラスよりも、トップレベル関数を使用することをおすすめします。

// File-level — usually cleaner:
fun greet(name: String) = "Hi, $name!"
// Versus:
class Greeter { companion object { fun greet(n: String) = "Hi, $n!" } }
fun main() {
    println(greet("Ada"))
    println(Greeter.greet("Ada"))
}

クラスごとに1つのコンパニオンオブジェクト

クラスに定義できるコンパニオンオブジェクトは最大1つです。必要に応じて、通常のネストしたobjectに追加の共有状態を保持できます。

class Service {
    companion object {
        val version = "1.0"
    }
    object InternalHelper { fun log() = println("internal") }
}
fun main() {
    println(Service.version)
    Service.InternalHelper.log()
}

コンパニオン拡張関数

クラスの外部からコンパニオンオブジェクトを拡張し、擬似staticヘルパーを追加できます。

class Lib {
    companion object
}
fun Lib.Companion.helper() = "added later"
fun main() {
    println(Lib.helper())
}

クイックチェック

KotlinでJavaのstaticメンバーに相当するものは何ですか。

まとめ

Kotlinにはstaticがありません。定数、ファクトリ、インターフェースの実装など、クラスレベルのメンバーにはコンパニオンオブジェクトを使用します。Javaとの相互運用には@JvmStaticを付け、擬似staticヘルパーが必要な場合は拡張関数で拡張します。

よくある質問

「companion object:Kotlinで静的メンバーのように使う」レッスンは無料ですか?

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

「companion object:Kotlinで静的メンバーのように使う」で何を学びますか?

クラスにcompanion objectを追加し、staticメソッドや定数に相当する機能を実現します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「companion object:Kotlinで静的メンバーのように使う」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. object宣言:Kotlinのシングルトン
  2. companion object:Kotlinで静的メンバーのように使う
  3. 匿名オブジェクトとオブジェクト式
  4. companion objectによるファクトリーメソッド
← Kotlin Academyに戻る