[kotlin] Preference 만들기

자바로 만들 때는 BaseAppPreference 클래스를 만들고 get/set 메소드를 넣어두고, AppPreferences는 singleton 으로 생성해서 사용했는데, 코틀린은 그게 좀 다른 것 같다.

일단 `object` 로 만들면 자동으로 singleton이 되는 것 같다.

일단 좀 더 공부를 해보고 더 좋은 방법이 있는지 찾아봐야겠다. 아니면 아예 gradle 플러그인을 찾는 것도 좋을 것 같다.

 

https://myprogrammingexperiments.wordpress.com/2017/06/04/manipulating-shared-prefs-with-kotlin-just-two-lines-of-code/ 에서 도움을 받아서 아래 코드를 만들었다.

object AppPreference {
  private val preference: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(App.instance.context())

  private val NAME = "name"
  private val AGE = "age"

  private operator fun set(key: String, value: Any?) {
    when (value) {
      is String? -> preference.edit().putString(key, value).apply()
      is Int -> preference.edit().putInt(key, value).apply()
      is Boolean -> preference.edit().putBoolean(key, value).apply()
      is Float -> preference.edit().putFloat(key, value).apply()
      is Long -> preference.edit().putLong(key, value).apply()
      else -> throw UnsupportedOperationException("Not yet implemented")
    }
  }

  private operator inline fun <reified T : Any> get(key: String, defaultValue: T? = null): T? {
    return when (T::class) {
      String::class -> preference.getString(key, defaultValue as? String) as T?
      Int::class -> preference.getInt(key, defaultValue as? Int ?: -1) as T?
      Boolean::class -> preference.getBoolean(key, defaultValue as? Boolean ?: false) as T?
      Float::class -> preference.getFloat(key, defaultValue as? Float ?: -1f) as T?
      Long::class -> preference.getLong(key, defaultValue as? Long ?: -1) as T?
      else -> throw UnsupportedOperationException("Not yet implemented")
    }
  }

  fun getName(): String? {
    return get(NAME)
  }

  fun setName(name: String) {
    set(NAME, name)
  }

  fun getAge(): Int? {
    return get(AGE, 0)
  }

  fun setAge(age: Int) {
    set(AGE, age)
  }
}

// AppPreference.setName("name")
// AppPreference.getName()
// AppPreference.setAge(12)
// AppPreference.getAge()

 


이거 맘에 든다. https://github.com/MarcinMoskala/PreferenceHolder

object AppPreference : PreferenceHolder() {
  var name: String? by bindToPreferenceFieldNullable()
  var users: List<User> by bindToPreferenceField(listOf())
}
fun write() {
  AppPreference.name = "name 45678"

  var users = ArrayList<User>()
  for (i in (1..5)) {
    users.add(User("name$1", i))
  }
  AppPreference.users = users
}

fun read() {
  Log.i("###", "name: " + AppPreference.name)

  for (user in AppPreference.users) {
    Log.i("###", "name: " + user.name + ", age: " + user.age)
  }
}