web-dev-qa-db-ja.com

Kotlinセカンダリコンストラクター

Kotlinでセカンダリコンストラクターを宣言するにはどうすればよいですか?

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

以下はコンパイルされません...

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

Update:M11(0.11。*)以降、Kotlinは secondary constructors をサポートしています。


今のところ、Kotlinはプライマリコンストラクターのみをサポートしています(セカンダリコンストラクターは後でサポートされる場合があります)。

セカンダリコンストラクターのほとんどのユースケースは、以下の手法のいずれかによって解決されます。

テクニック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")
79
Andrey Breslav

ドキュメントポイント として、この方法でセカンダリコンストラクターを使用できます

class GoogleMapsRestApiClient constructor(val baseUrl: String) {

    constructor() : this("https://api.whatever.com/")

}

最初のコンストラクターの動作を拡張する必要があることに注意してください。

24
cesards

セカンダリコンストラクターKotlinを宣言するには、constructorキーワードを使用します。

これはプライマリコンストラクターです。

class Person constructor(firstName: String) {

}

または

class Person(firstName: String) {

}

次のようなセカンダリコンストラクターコードの場合:

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

プライマリconstructorを呼び出すことが必須です。それ以外の場合、compilerはスローされます次のerror

Primary constructor call expected
15
Rashid Iqbal

initを持つコンストラクター:

class PhoneWatcher : TextWatcher {

    private val editText: EditText
    private val mask: String

    private var variable1: Boolean = false
    private var variable2: Boolean = false

    init {
        variable1 = false
        variable2 = false
    }

    constructor(editText: EditText) : this(editText, "##-###-###-####")

    constructor(editText: EditText, mask: String) {
        this.editText = editText
        this.mask = mask
    }
    ...
}
7
CoolMind

constructorを使用してKotlinで複数のコンストラクターを定義できますが、デフォルトのコンストラクターclass AuthLog(_data: String)をスキップする必要があります

class AuthLog {

    constructor(_data: String): this(_data, -1)

    constructor(_numberOfData: Int): this("From count ", _numberOfData)

    private constructor(_data: String, _numberOfData: Int)

}

詳細はこちらをご覧ください

更新

これで、デフォルトのコンストラクタを定義できます

class AuthLog(_data: String, _numberOfData: Int) {

    constructor(_data: String): this(_data, -1) {
        //TODO: Add some code here if you want
    }

    constructor(_numberOfData: Int): this("From count", _numberOfData)

}

私はこの質問を見たばかりで、アンドレイが提案したものよりも優れた別のテクニックがあるかもしれないと思います。

class C(a: Int) {
    class object {
        fun invoke(name: String) = C(name.length)
    }        
}

invokeメソッドは、Scalaでapplyメソッドが機能するのと同じように機能するため、val c:C = C(3)またはval c:C = C("abc")のように記述できます。

更新

現在、セカンダリコンストラクターは既に言語仕様の一部であるため、この回避策は使用しないでください。

4
caeus

以下のコードスニペットは動作するはずです

class  C(a:Int){
  constructor(s:String):this(s.length){..}
}
class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

これを試すことができます。

1
Ruhul

私はほとんどの答えに少し混乱しました。わかりやすくするために、より多くの要素を持つ例を追加しています。

   @JsonInclude(JsonInclude.Include.NON_NULL)
   data class Response(val code: String) {
      var description: String? = null
      var value: String? = null

      constructor(code: String, description: String?) : this(code) {
          this.description = description
      }

      constructor(code: String, description: String?, value: String) : this(code, description) {
          this.value = value
      }
   }
0
Abbin Varghese

kotlinセカンダリコンストラクターの例

class Person(name: String){
    var name=""
    var age=0

    constructor(age :Int,name : String)  : this(name){
        this.age=age
        this.name=name
    }
    fun display(){
        print("Kotlin Secondary constructor $name  , $age")
    }
}

主な機能

fun main(args : Array<String>){

    var objd=Person(25,"Deven")
    objd.display()
}
0
Deven Mer