11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Kotlinでメソッドチェーンするための実装

Last updated at Posted at 2018-12-03

この記事は、ACCESS Advent Calendar 2018 4日目の記事です。

はじめに

thisを返す関数の実装方法についてです。

Builderパターンにおいてメソッドチェーンをよく使いますが、Kotlinには Default arguments があるため、BuilderパターンもKotlinではあまり使うことはないかなと思っていました。

が、

ということで、
最近試した、メソッドチェーンのためにthisを返す関数の実装方法を紹介します。

普通にやると

val neko: Neko = Neko().foo().bar()

class Neko {
    fun foo(): Neko {
        // do something
        return this
    }
    fun bar(): Neko {
        // do something
        return this
    }
}

上記のように、戻り値の型を明記したり return this を書くのは、ちょっと冗長です。

apply() を expression body として使う

val neko: Neko = Neko().foo().bar()

class Neko {
    fun foo() = apply {
        // do something
    }
    fun bar() = apply {
        // do something
    }
}

かなりシンプルになりました。

継承して使うには、もう一工夫

apply を使っても戻り値の型は Neko なので、Self-typeのようには使えず、
継承して使いたいときには困ったりもします。

class MikeNeko : Neko() {
    fun baz() = apply {
        // do something
    }
}

// Compile Error: barの戻り値はMikeNekoではなくNekoであるため。
val tama = MikeNeko().foo().bar().baz()

こういう場合は、拡張関数を使うと、なんとかなります。

open class Neko

fun <T : Neko> T.foo() = apply {
    // Nekoを継承したクラスに対してなにか処理してそのインスタンス自体を返す
}

こんなに頑張ってまで、継承を使って一体何を実現するのかという気もしますが、1つのやり方として。


明日の ACCESS Advent Calendar 2018 は @kenrota です。

11
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?