背景
Androidでサーバへ何度も問い合わせ必要の無い値や、app起動後しばらく同じ値を使いまわしたい時、値を保持しておくためのRepositoryが欲しくなったというシーンがあり、お試しで作ってみました。(なお本導入には至ってはおらず)
実践
開発環境や構成によってインタフェースがあったりDIがあったりと制約が多少はあるかもしれませんがお手軽にmapを使ってcacheするクラスを作成してみました。
/**
* 簡易的なcache クラス.
*
* @author st-miz
*/
class CacheRepository {
companion object {
// defaultは5分cacheする想定
private const val EXPIRED_TIME_MINUTES = 5L
}
private val cacheMap = mutableMapOf<String, CacheValue>()
fun <T : Any> load(key: String): T? {
cacheMap[key]?.let {
if (it.expired()) {
cacheMap.remove(key)
return null
} else {
return it.data as? T
}
}
return null
}
fun <T : Any> save(key: String, data: T, expiredMinutes: Long = EXPIRED_TIME_MINUTES) {
cacheMap[key] = CacheValue(
data = data,
expiredMinutes = expiredMinutes,
)
}
fun remove(key: String) {
cacheMap.remove(key)
}
fun clear() {
cacheMap.clear()
}
private data class CacheValue(
val data: Any,
private val expiredMinutes: Long,
) {
private val expired: LocalDateTime = LocalDateTime.now().plusMinutes(expiredMinutes)
fun expired(): Boolean {
return LocalDateTime.now() > expired
}
}
}
感想
map使ってもいいんですが、普通にLruCacheとかでいい気がしてきたのでそのうち別記事を書くかもしれない。