[Kotlin] 「何もしない」関数をいい感じに書きたい
目次
Kotlinで「何もしない」関数をきれいに書きたい、というtrialです。
返り値を持たない関数
返り値を持たない関数は、通常、何らかの副作用を持つ処理を実行する関数です。例えば、特定の文字列を標準出力する関数などですね。以下のようなコードです。
fun doSomething() {
println("Hello World")
}
Kotlinでは、このような関数は Unit
型を返します。Kotlinにおいては、「返り値を持たない関数」というのは、実は「返り値が Unit
である関数」であると言えそうです。
fun main() {
val value = doSomething()
value is Unit // true
}
そのため、最初のサンプルコードに示した doSomething
関数の正確なシグネチャは以下のようになります。もちろん、返り値の型が Unit
の場合には、通常関数の返り値の型を省略します。
fun doSomething(): Unit {
println("Hello World")
}
何もしない関数
ところで、何もしない関数を定義することがあります。
例えば、こういう interface
があったとします。
interface AwesomeInterface {
fun doSomething()
}
この interface
を実装するけど、実際には何もしない、という場合があります(「nullオブジェクトパターン」というやつでしょうか)。こんな感じです。
fun main() {
val awesome: AwesomeInterface = object : AwesomeInterface {
override fun doSomething() {
// NOP
}
}
awesome.doSomething() // do nothing
}
こういう時は // 何もしない
とか // NOP
とか // NOOP
とかのコメントを書いたブロックを置くことが多いと思います。ここではもうひと工夫してみます。「返り値を持たない関数」で書いたように、こういった関数は、実は Unit
を返しているのでした。ということは、ブロックの代わりに、関数本体として Unit
を返せばよいということになります。以下のコードです。
val awesome: AwesomeInterface = object : AwesomeInterface {
override fun doSomething() = Unit
}
このコードはKotlinのコードとして100%正しいですが、Kotlinに習熟していない人にとっては意図を理解しにくい記法であるとも思います。
そこでさらにひと工夫してみます。 Unit
型に NOP
という名前でtypealiasを付けてみます。
typealias NOP = Unit
そうすると、先ほどのコードを以下のように修正することができます。
val awesome: AwesomeInterface = object : AwesomeInterface {
override fun doSomething() = NOP
}
このように書けば、 doSomething
関数が「何もしない」関数であることをコードで表現できる…と思うのですがどうでしょうか。typealiasを付けたり、関数本体を返したりといった細かいテクニックを駆使しているので、Kotlinに習熟していない人にとってはもしかしたら逆に馴染みにくい記法になっている、という可能性はあります。
そうだとすると、一周回ってコメントで愚直に書くのが良いのかもしれません。
val awesome: AwesomeInterface = object : AwesomeInterface {
override fun doSomething() {
// NOP
}
}
自分は fun doSomething() = NOP
と書くのが好みなので、自分の趣味100%で書くプロジェクトであれば、 fun doSomething() = NOP
で書きます。そうでない時は…コメントで書くかもしれません。
Reference
- Unit - Kotlin Programming Language(最終アクセス日:2022年1月22日)
書いている人 😎

茨城県つくば市在住のモバイルアプリケーションアーキテクト(Androidが得意です)。モバイルアプリのアーキテクチャ、自動テスト、CI/CDに興味があります。いわゆる「レガシーコード」のリファクタリング・リアーキテクチャが好きです。
👉 もっと詳しく
著書 ✍
ソフトウェアデザイン 2023年6月号📚
特集「クリーンアーキテクチャとは何か?」の第5章「モバイルアプリ開発における実践」を執筆しました。
Android クリーンアーキテクチャ ヒッチハイク・ガイド🧳
Androidアプリでのクリーンアーキテクチャに入門するためのガイダンスです。クリーンアーキテクチャの概念を理解し、Androidアプリに適用する方法を解説しています。
Android ユニットテスト ヒッチハイク・ガイド🧳
Androidアプリのユニットテストに入門するためのガイダンスです。初学者が混乱せずにAndroidアプリのユニットテストを書き始めることができる、ということを目的としています。
Android MVVMアーキテクチャ入門🛠
Androidアプリ開発の初学者に向けた、MVVM(Model-View-ViewModel)アーキテクチャの入門書を書きました。初学者の方を確実にネクストレベルに引き上げる技術書です。NextPublishingより出版されています。
関連記事 👀
- DroidKaigi.collect{ #1@Tokyo }で「例外を投げるな、値を返せ」というLTをしました
- [Kotlin] 末尾カンマ
- [Kotlin] ifを愛でる
- [Kotlin] ユークリッドの互助法を用いて最小公約数・最小公倍数の計算を実装する
- [Kotlin] 負数に対する除算の商と剰余