class Hoge constructor() { }
class Hoge constructor(_name:String) {
val name:String = _name
}
constructorは省略可能。
class Hoge (_name:String) {
val name:String = _name
}
上記のコードはdataを指定することで以下のように記載可能。
data class Hoge(val name:String) {}
データクラスはequalsとhashCode、toString()が自動生成される。
>>> class Hoge {
... constructor(){}
... constructor(_name:String){println(_name) }
... }
>>> Hoge()
res29: Line_28.Hoge = Line_28$Hoge@5c9e8a67
>>> Hoge("hoge")
hoge
res30: Line_28.Hoge = Line_28$Hoge@9f0fc36
>>>
class Fuga private constructor() {}
class Hoge {
init {
println("init");
}
}
class Hoge constructor(_name:String) {
val name:String = _name
init {
println("init")
}
}
fun hoge(): String =
"Hello, World"
fun main(args: Array<String>) {
println(hoge())
}
Rubyのオープンクラス。 Javaの場合だとXXUtilsみたいなものを定義する必要があるが、Kotlinでは以下のように既存のクラスを拡張できる。
>>> fun String.isHoge() : Boolean = this.equals("hoge");
>>> println("fuga".isHoge())
false
>>> println("hoge".isHoge())
true
>>>
ext.kt
package sample;
fun String.isHoge() : Boolean = this.equals("hoge");
ビルド & 実行
$ kotlinc ext.kt -include-runtime -d ext.jar $ jshell -c ~/.sdkman/candidates/kotlin/1.3.61/lib/kotlin-stdlib.jar:ext.jar
呼び出し
jshell> import sample.*;
jshell> ExtKt.isHoge("hoge")
$2 ==> true
jshell> ExtKt.isHoge("fuga")
$3 ==> false
class Hoge<T, R> (val v:Map<T, R> = HashMap<T, R>()) : Map<T, R> by v {}
class Hoge() {
private var _name:String? = null
val name:String get() {
if (_name == null) {
_name = "hoge"
}
return _name!!
}
}
class Hoge() {
val name:String by lazy { "hoge" }
}