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" } }