Kotlin

Kotlin - 文法 - メモ

kotlinは便利だけど、便利故に勝手に期待をする -> やっぱりできなかった。 -> どうやるの?
と、深く考えることなしにハマってしまう。
そんな私の備忘録。

コンストラクタ

下記のクラスにセカンダリを追加する場合、list: ArrayList<Any>はデリゲートができない。

class Hoge(var list: List<Any>)

結局、プライマリ+α な引数にするという形をとることにした。

class Hoge(val list: List<Any>) {
    constructor(foo:String, bar: ArrayList<Any>) : this(bar) {

        // barzもデリゲートできない
        val barz = ArrayList<Any>()

        // ちなみにセカンダリの引数は自動的にval相当になる(var, valの指定不可)
        // 下記はエラー
        foo = ""

    }
}

考えてみたら当たり前のことで異なるコンストラクタの引数を参照できるわけがない。

when

break, continueが使えないので迷った。

  • returnするとメソッドを抜けてしまう。
  • loopは使えたとしても極力使いたくない。

when句からのexitは空の中括弧で対応した。

val hoge:String = foo
when (hoge) {
    null -> return
    "" -> {}
    "a" -> {return} //nullと同じ挙動
    else -> {
        print(hoge)
    }
}

Properties

IntelliJではresources配下に対して以下のようにしてアクセスができた。

~/resources
    /dev
       /example.properties
    /prod
       /example.properties
val prop = Properties()
val env = "dev"
prop.load(this::class.java.getResource("/${env}/example.properties").openStream())

参照
https://stackoverflow.com/questions/42739807/how-to-read-a-text-file-from-resources-in-kotlin

Paths

作業ディレクトリの取得方法

Paths.get("").toAbsolutePath().toString()

SLF4J

val logger = LoggerFactory.getLogger(this::class.java)