[Kotlin] nullオブジェクトパターン
目次
Kotlinでnullオブジェクトパターンを実装する例です。こんな感じのinterfaceを考えます。
interface AwesomeRunnable {
fun runSomething()
}
nullオブジェクトパターンを使わない場合
nullオブジェクトパターンを使わない場合は、こんな感じのifチェックを呼び出し側で毎回書かないといけません。対象の変数がnullなのかどうかということに興味がある場合は毎回nullチェックをするのもやぶさかではありません。
fun main() {
val awesomeRunnable: AwesomeRunnable? = null
if (awesomeRunnable != null) {
awesomeRunnable.runSomething()
}
}
nullオブジェクトパターンを使う場合
対象の変数がnullなのかどうかということに興味がない場合もあります。こういう場合はnullオブジェクトパターンの使用に一考の価値があります。
以下のコードは「何かを行う」関数を呼び出しています。
fun main() {
val doSomethingRunnable: AwesomeRunnable = object : AwesomeRunnable {
override fun runSomething() {
println("do something")
}
}
doSomethingRunnable.runSomething()
}
これに対して、以下のコードはnullオブジェクトパターンを用いた「何もしない」関数を呼び出しています。この場合は、インスタンスに対して runSomething
関数を呼び出しても、実際には何の処理も行われません12。
fun main(args: Array<String>) {
val doNothingRunnable: AwesomeRunnable = object : AwesomeRunnable {
override fun runSomething() {
// NOP
}
}
doNothingRunnable.runSomething()
}
nullオブジェクトパターンを用いたことで、「何かを行う」場合も「何もしない」場合も、処理を呼び出す側ではnullチェックが不要となっています。このように、オブジェクトがnullかどうかということには関心を持ちたくないが、実際には処理を呼び出した時に何もしないで欲しいことがある、という場合にnullオブジェクトパターンが使えることがあります。
上記の例ではオブジェクト式を用いた無名クラスでnullオブジェクトを作成していますが、以下のようにnullオブジェクトをひとつだけ定義しておけば、コードの重複を防ぐことができます3。
object NullRunnable : AwesomeRunnable {
override fun runSomething() {
// NOP
}
}
書いている人 😎

茨城県つくば市在住のモバイルアプリケーションアーキテクト(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] 負数に対する除算の商と剰余