1. HOME
  2. ブログ
  3. IT技術
  4. 【Kotlin】DelegatedProperties(委譲プロパティ) を使って Android SharedPreferences を使いやすくしてみた

【Kotlin】DelegatedProperties(委譲プロパティ) を使って Android SharedPreferences を使いやすくしてみた

DelegatedProperties(委譲プロパティ)をご紹介

 

江幡さん 江幡さん

(株)ライトコードの江幡(えばた)です!

以前より、SharedPreferencesについてこんなことを感じていました。

「Key や デフォルト値を const(定数) で管理するのわかりづらいなぁ...」「もっと、わかりやすく単純に書く方法はないかなぁ?」

そう思っていたところ、Kotlin の DelegatedProperties(委譲プロパティ) を使えば、うまく解決できそうだったのでご紹介したいと思います!

今回は、Kotlin の DelegatedProperties(委譲プロパティ) についてお勉強しましょう!

DelegatedProperties(委譲プロパティ) とは

その名の通り、Kotlinの プロパティ 機能を、別のクラスに委譲することができる仕組みです。

個人的に、「カスタムGetter/Setter を別のクラスに書くもの」のようなものだと思っています。

委譲プロパティの書き方

プロパティ定義の右側に by を記載して定義します。

var myProperty: Int by Hoge()

上記は、こんなことを定義しています。

  1. myProperty への読み書き(Getter/Setter)の処理を、by の右側の Hoge で行うようにする

このときの Hoge は ReadWriteProperty を継承している必要があります。

これで myProperty のget時には getValue()  が呼ばれ、set時には setValue()  が呼ばれるようになります!

SharedPreferences を使いやすくしてみた

この委譲プロパティを用いて、SharedPreferencesを使いやすくしたソースコードは以下の通りです。

使い方

6、7行目のプロパティ(totalLaunchCount や lastLaunchTime)への読み書きが、

そのまま、プロパティ名をKey とした ShardPreferences への読み書きになります。

新たにSharedPreferencesの項目を追加したい場合は、以下のように、書くだけでOKです。

・non-nullの場合

var プロパティ名: Int by pref(default = 0)

・nullableの場合

var プロパティ名: Int? by nullablePref()

解説

江幡さん 江幡さん
pref()  か  nullablePref()  で 委譲先のインスタンスを取得しています。
ミツオカミツオカ
引数でデフォルト値を設定できるんですね!
江幡さん 江幡さん
委譲先の getValue() setValue() にて、SharedPreferencesの読み書きを行っています。13、21、30、35行目のように val key = property.name でプロパティ名が取得できるので、SharedPreferencesの読み書きに必要なKeyとして利用しています。
ミツオカミツオカ
なるほど!ここでプロパティ名を取得して、Keyとして使っているのですね!

さいごに

プロパティ名をそのままKeyとして使ってくれるので、わざわざconst(定数)を書く必要がなくなりました

また、デフォルト値もわかりやすい位置に書けるようになりました。

書こうと思えば SharedPreferences で保存できない型でも定義できてしまうのが少し気になります。

でも、自分で使うだけなら、問題はないかなぁと思っています。

(もし忘れていても例外出るので...)

もし気になるのであれば、 fun intPref(): ReadWriteProperty<SharedPref, Int> {/*...省略...*/} という感じで、各型専用の委譲先クラスを作ればいいと思います。

今回は、 SharedPreferences を対象にしましたが、委譲プロパティは他にも色々と使えそうですね。

面白い使い方があれば、またご紹介していきます!

こちらの記事もオススメ!

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア