Page History

クラス・関数

yhornisse edited this page on 21 Dec 2020

Clone this wiki locally

クラス・関数

コンストラクタ

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

privateコンストラクタ

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

Javaから呼び出す場合

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

委譲プロパティ

遅延初期化(lazyメソッド)

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