kotlin コンストラクタのオーバーロード


kotlin コンストラクタ記述の基本形

primary constructor
class Foo(str:String) : Bar(str){ }

この場合、Fooとその親クラスにStringを引数とするコンストラクタが定義された、されていることになる。また、クラス宣言で記述するclass Foo(str:String)はプライマリコンストラクタと呼ばれるコンストラクタとなる。

コンストラクタのオーバーロード

secondary constructor

では、Foo(str:String, num:Int)のコンストラクタを定義するにはどうするかというとセカンダリコンストラクタを使用する。

class Foo(str:String) : Bar(str){
    //セカンダリコンストラクタ
    constructor(str:String, num:Int):this(str){}
}

this(str)は、プライマリコンストラクタの記述がある場合、セカンダリコンストラクタからプライマリコンストラクタを呼び出す必要がある為の記述となる。

プライマリコンストラクタの省略

またJavaライクにプライマリコンストラクタを省略して記述することも可能。この時はプライマリコンストラクタが省略されているのでthis()の呼び出しが必要なくなる。

class Foo : Bar{
    constructor(var:String):super(var){ }
    //オーバーロード
    constructor(var:num):super(var.toString()){ }
    constructor(var:String, num:Int):super(var){ }
}

Javaに慣れている人はこのパターンが解釈しやすいかな。と思う。

もちろん、オーバーロードが必要ない時でも、

class Foo : Bar{
    constructor(var:String):super(var){ }
}

として記述することができる。