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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- object宣言:Kotlinのシングルトン
- companion object:Kotlinで静的メンバーのように使う
- 匿名オブジェクトとオブジェクト式
- companion objectによるファクトリーメソッド