Android Kotlin インターフェイスの実装方法 3 パターン

さて引き続き Android プロジェクトをやっているわけですが、オブジェクトにリスナーを渡してコールバックを登録する処理があると思うのですが、そのコールバックがインターフェイスの場合の実装方法についての話です。

ひとことで言えば、インターフェイスは実装がないのでそのままでは変数にできないのでどうしよう ? ってときの定形のパターンです。

実装したクラスを作るパターン

素直にクラスを実装して渡すとこんな感じに書けます。

public interface ReadListener {
  fun onSuccess(message: String)
}

class MyReadListener: ReadListener {
  override fun onSuccess(message: String) {
    // do something
  }
}

val listener = MyReadListener()
target.addReadListener(listener)

クラス作るのはちょっと大げさなときはリスナーを登録する際に、定義する方法があるようだ。

登録するときに実装してしまうパターン

こっちのほうがよく見ると思う。そもそも変数いらなくねってパターン。

target.addReadListener(object: ReadListener {
  override fun onSuccess(message: String) {
    // do something
  }
})

object でiインターフェイスの型を指定すると {} で定義ができるっていうふうに解釈しましたがあっているのか?ちょっと不安ではあるが現時点の知識ではここまでが自分の限界。

変数に無名クラスで実装するパターン

調べていくと、パターン1 を無名クラスにする方法もあるようで今回はリスナー後で使いまわしたかったのでこのパターンにした。

val myListener = object: ReadListener {
  override fun onSuccess(message: String)
}
target.addREadListener(myListerner)

このへんのパターンは武道の型のように何度もやって覚えるしかないっていうのが個人的な感想。