0Pricing
Kotlin Academy · レッスン

companion objectによるファクトリーメソッド

companion objectとinvoke演算子を使ってファクトリーパターンを実装します。

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

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

ファクトリメソッドは、意味のある名前とロジックを使ってオブジェクトを作成し、コンストラクターの複雑さを隠します。Kotlinでは、コンパニオンオブジェクトがファクトリメソッドの配置場所として最適です。

privateコンストラクターとファクトリ

コンストラクターをprivateにし、コンパニオンオブジェクト経由でファクトリメソッドを提供します。
class Token private constructor(val value: String) {
    companion object {
        fun generate() = Token(java.util.UUID.randomUUID().toString())
        fun fromString(s: String) = Token(s.trim())
    }
}
val t = Token.generate()

名前付きファクトリメソッド

説明的な名前を付けると意図が明確になります。コンストラクターのオーバーロードよりも意図を伝えやすくなります。
class Duration private constructor(val ms: Long) {
    companion object {
        fun ofMillis(ms: Long) = Duration(ms)
        fun ofSeconds(s: Long) = Duration(s * 1000)
        fun ofMinutes(m: Long) = Duration(m * 60_000)
    }
}
val d = Duration.ofMinutes(5)

ファクトリからnullを返す

ファクトリは、例外をスローする代わりに、無効な入力に対してnullを返せます。
class Percentage private constructor(val value: Int) {
    companion object {
        fun of(value: Int): Percentage? {
            return if (value in 0..100) Percentage(value) else null
        }
    }
}
val p = Percentage.of(75) ?: error("Invalid")

インスタンスのキャッシュ

ファクトリはインスタンスをキャッシュして再利用できます。
class Direction private constructor(val name: String) {
    companion object {
        private val cache = mutableMapOf<String, Direction>()
        fun of(name: String) = cache.getOrPut(name.uppercase()) {
            Direction(name.uppercase())
        }
    }
}

コンストラクター風ファクトリとしてのinvoke演算子

invoke()を定義すると、クラスを関数のように呼び出せます。
class Email private constructor(val address: String) {
    companion object {
        operator fun invoke(raw: String): Email {
            require("@" in raw) { "Invalid email" }
            return Email(raw.lowercase())
        }
    }
}
val e = Email("Test@Example.com")  // looks like a constructor

sealedクラスによる抽象ファクトリ

ファクトリメソッドとsealedクラス階層を組み合わせると、型安全な生成を実現できます。
sealed class Shape {
    data class Circle(val r: Double) : Shape()
    data class Rect(val w: Double, val h: Double) : Shape()
    companion object {
        fun circle(r: Double) = Circle(r)
        fun rect(w: Double, h: Double) = Rect(w, h)
    }
}

依存関係を扱うファクトリ

ファクトリは依存関係を受け取り、それらを組み立てることができます。
class Repository(private val db: Database) {
    companion object {
        fun create(db: Database = Database.instance) = Repository(db)
    }
    fun findAll() = db.query("SELECT * FROM items")
}

テストでのファクトリ

ファクトリメソッドを使うと、テスト用オブジェクトをすっきりと明示的に作成できます。
class Order private constructor(
    val id: Long, val items: List<String>, val paid: Boolean
) {
    companion object {
        fun unpaid(id: Long, items: List<String>) = Order(id, items, false)
        fun paid(id: Long, items: List<String>) = Order(id, items, true)
    }
}

JSONや設定からの生成

ファクトリは、パース処理の入り口として自然な役割を果たします。
class AppConfig private constructor(
    val baseUrl: String, val timeout: Int
) {
    companion object {
        fun fromEnv() = AppConfig(
            baseUrl = System.getenv("BASE_URL") ?: "http://localhost",
            timeout = System.getenv("TIMEOUT")?.toInt() ?: 30
        )
    }
}

privateコンストラクターを使用すべきでない場合

スタイルだけを理由にコンストラクターをprivateにしないでください。検証が必要な場合、キャッシュが必要な場合、または複数の生成経路にそれぞれ異なる意味がある場合に使用します。

クイックチェック

コンパニオンオブジェクトをコンストラクターのようにEmail("a@b.com")と呼び出せるようにする演算子関数は何ですか。

まとめ

コンパニオンオブジェクトのファクトリメソッドでは、privateコンストラクターと名前付きファクトリ、必要に応じたnullの返却、キャッシュ、コンストラクター風構文のためのinvoke()を使用します。ファクトリによって、オブジェクトの生成が安全で表現力豊かになり、テストもしやすくなります。

よくある質問

「companion objectによるファクトリーメソッド」レッスンは無料ですか?

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

「companion objectによるファクトリーメソッド」で何を学びますか?

companion objectとinvoke演算子を使ってファクトリーパターンを実装します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「companion objectによるファクトリーメソッド」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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