okuzawatsの日記

Android / Kotlin / GitHub Actions Enthusiast 🤖

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

  1. Unit を返す、という処理は行われます。 ↩︎

  2. Kotlinの object キーワードを用いていますが、nullオブジェクトの「オブジェクト」とはあまり関係がありません。 ↩︎

  3. この例でもKotlinの object キーワードを用いていますが、こちらもnullオブジェクトの「オブジェクト」とはあまり関係がありません。 ↩︎

#Kotlin #Design Pattern

書いている人 😎

profile

茨城県つくば市在住のモバイルアプリケーションアーキテクト(Androidが得意です)。モバイルアプリのアーキテクチャ、自動テスト、CI/CDに興味があります。いわゆる「レガシーコード」のリファクタリング・リアーキテクチャが好きです。

Androidプロジェクトの開発速度低下にお悩みで、お手伝いが必要でしたら、メールフォームよりお気軽にお問い合わせください。

👉 もっと詳しく

著書 ✍

Android MVVMアーキテクチャ入門 🛠

Androidアプリ開発の初学者に向けた、MVVM(Model-View-ViewModel)アーキテクチャの入門書を書きました。初学者の方を確実にネクストレベルに引き上げる技術書です。NextPublishingより出版されています。

販売サイトへ 🏃

Android ユニットテスト ヒッチハイク・ガイド 🧳

Androidアプリのユニットテストに入門するためのガイダンスです。初学者が混乱せずにAndroidアプリのユニットテストを書き始めることができる、ということを目的としています。

販売サイトへ 🏃

関連記事 👀

お問い合わせ 📨

お名前

メールアドレス

お問い合わせ内容