1. ホーム
  2. syntax

[解決済み] Kotlin 2次コンストラクタ

2022-06-01 21:30:49

質問

Kotlinで2次コンストラクタを宣言するにはどうしたらいいですか?

それに関するドキュメントはありますか?

以下がコンパイルできません...

class C(a : Int) {
  // Secondary constructor
  this(s : String) : this(s.length) { ... }
}

どのように解決するのですか?

更新 : M11 (0.11.*) から Kotlin は以下のものをサポートします。 2次コンストラクタ .


今のところKotlinは一次コンストラクタのみをサポートしています(二次コンストラクタは後でサポートされるかもしれません)。

2次コンストラクタのほとんどのユースケースは、以下のテクニックの1つによって解決されます。

テクニック1. (あなたのケースを解決する) クラスの横にファクトリーメソッドを定義する。

fun C(s: String) = C(s.length)
class C(a: Int) { ... }

の使い方を説明します。

val c1 = C(1) // constructor
val c2 = C("str") // factory method

テクニック2。 (これも有効かも) パラメータにデフォルト値を定義する

class C(name: String? = null) {...}

の使い方を説明します。

val c1 = C("foo") // parameter passed explicitly
val c2 = C() // default value used

なお、デフォルト値 はどのような関数に対しても機能します。 のみならず、コンストラクタ

テクニック3. (カプセル化が必要な場合) コンパニオンオブジェクトで定義されたファクトリーメソッドを利用する

コンストラクタを非公開にして、ファクトリーメソッドだけをクライアントから利用したい場合があります。今のところ、これは コンパニオンオブジェクト :

class C private (s: Int) {
    companion object {
        fun new(s: String) = C(s.length)
    }
}

の使い方を説明します。

val c = C.new("foo")