Đăng nhập Tài khoản VIP

Android SharedPreferences với Kotlin style

Hôm nay mình quay bài về SharePreferences cho khóa học Android và có lên Medium để giao lưu, cũng khá vui khi gặp một bài của dev Việt Nam anh Vũ Đức Tuyến SharedPreferences — Made easy with Kotlin generics & extensions.


Bình thường khi làm việc với SharePreferences trong các project Android thì chúng ta luôn chuẩn bị một class helper và bên trong là các factory method tương tác với Key - Value. Trong Kotlin có khai niệm Extension Function và chúng ta có thể ứng dụng nó để thay cho việc sử dụng một class helper.


Hãy xem code của anh Tuyến

import android.content.SharedPreferences

inline fun <reified T> SharedPreferences.get(key: String, defaultValue: T): T {
    when(T::class) {
        Boolean::class -> return this.getBoolean(key, defaultValue as Boolean) as T
        Float::class -> return this.getFloat(key, defaultValue as Float) as T
        Int::class -> return this.getInt(key, defaultValue as Int) as T
        Long::class -> return this.getLong(key, defaultValue as Long) as T
        String::class -> return this.getString(key, defaultValue as String) as T
        else -> {
            if (defaultValue is Set<*>) {
                return this.getStringSet(key, defaultValue as Set<String>) as T
            }
        }
    }

    return defaultValue
}

inline fun <reified T> SharedPreferences.put(key: String, value: T): T {
    val editor = this.edit()

    when(T::class) {
        Boolean::class -> editor.putBoolean(key, value as Boolean)
        Float::class -> editor.putFloat(key, value as Float)
        Int::class -> editor.putInt(key, value as Int)
        Long::class -> editor.putLong(key, value as Long)
        String::class -> editor.putString(key, value as String)
        else -> {
            if (value is Set<*>) {
                editor.putStringSet(key, value as Set<String>)
            }
        }
    }

    editor.commit()
}

Mình không thích version này lắm vì nó pha tạp chút tư duy Java.


Và đây là version của mình.

import android.content.SharedPreferences

inline fun <reified T> SharedPreferences.get(key: String, defaultValue: T) = with(this) {
    when(T::class) {
        Boolean::class -> getBoolean(key, defaultValue as Boolean) as T
        Float::class -> getFloat(key, defaultValue as Float) as T
        Int::class -> getInt(key, defaultValue as Int) as T
        Long::class -> getLong(key, defaultValue as Long) as T
        String::class -> getString(key, defaultValue as String) as T
        else -> {
            null
        }
    }
}

inline fun <reified T> SharedPreferences.put(key: String, value: T) = with(this.edit()) {
    when(T::class) {
        Boolean::class -> putBoolean(key, value as Boolean)
        Float::class -> putFloat(key, value as Float)
        Int::class -> putInt(key, value as Int)
        Long::class -> putLong(key, value as Long)
        String::class -> putString(key, value as String)
    }
    commit()
}