2017-11-13 9 views
0

次のコードAは私がコードA.クラスが必要な理由Preference <T>はオブジェクトでラップする必要がありますか?

を使用する場合、私はオブジェクトDelegatesExt

で、なぜ著者ラップクラスのプリファレンス(...)を理解していない呼び出すために private var zipCode: Long by DelegatesExt.preference(this, ZIP_CODE, DEFAULT_ZIP)を使用することができます https://github.com/antoniolg/Kotlin-for-Android-Developers/blob/master/app/src/main/java/com/antonioleiva/weatherapp/extensions/DelegatesExtensions.kt

からです

コードBはもっとシンプルだと思いますが、コードBを使用すると呼び出すにはを使用できます

なぜクラスが必要なのかオブジェクトでラップするのはなぜですか?ロングDelegatesExt.preference(これ、ZIP_CODE、DEFAULT_ZIP)によってときに呼び出す:私は民間のVaRの郵便番号を使用することができます

コードA

object DelegatesExt { 
    fun <T> notNullSingleValue() = NotNullSingleValueVar<T>() 
    fun <T> preference(context: Context, name: String, 
      default: T) = Preference(context, name, default) 
} 

class NotNullSingleValueVar<T> { 

    private var value: T? = null 

    operator fun getValue(thisRef: Any?, property: KProperty<*>): T = 
      value ?: throw IllegalStateException("${property.name} not initialized") 

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { 
     this.value = if (this.value == null) value 
     else throw IllegalStateException("${property.name} already initialized") 
    } 
} 

class Preference<T>(private val context: Context, private val name: String, 
     private val default: T) { 

    private val prefs: SharedPreferences by lazy { 
     context.getSharedPreferences("default", Context.MODE_PRIVATE) 
    } 

    operator fun getValue(thisRef: Any?, property: KProperty<*>): T = findPreference(name, default) 

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { 
     putPreference(name, value) 
    } 

    @Suppress("UNCHECKED_CAST") 
    private fun findPreference(name: String, default: T): T = with(prefs) { 
     val res: Any = when (default) { 
      is Long -> getLong(name, default) 
      is String -> getString(name, default) 
      is Int -> getInt(name, default) 
      is Boolean -> getBoolean(name, default) 
      is Float -> getFloat(name, default) 
      else -> throw IllegalArgumentException("This type can be saved into Preferences") 
     } 

     res as T 
    } 

    @SuppressLint("CommitPrefEdits") 
    private fun putPreference(name: String, value: T) = with(prefs.edit()) { 
     when (value) { 
      is Long -> putLong(name, value) 
      is String -> putString(name, value) 
      is Int -> putInt(name, value) 
      is Boolean -> putBoolean(name, value) 
      is Float -> putFloat(name, value) 
      else -> throw IllegalArgumentException("This type can't be saved into Preferences") 
     }.apply() 
    } 
} 

コードB

class NotNullSingleValueVar<T> { 

    private var value: T? = null 

    operator fun getValue(thisRef: Any?, property: KProperty<*>): T = 
      value ?: throw IllegalStateException("${property.name} not initialized") 

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { 
     this.value = if (this.value == null) value 
     else throw IllegalStateException("${property.name} already initialized") 
    } 
} 

class Preference<T>(private val context: Context, private val name: String, 
     private val default: T) { 

    private val prefs: SharedPreferences by lazy { 
     context.getSharedPreferences("default", Context.MODE_PRIVATE) 
    } 

    operator fun getValue(thisRef: Any?, property: KProperty<*>): T = findPreference(name, default) 

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { 
     putPreference(name, value) 
    } 

    @Suppress("UNCHECKED_CAST") 
    private fun findPreference(name: String, default: T): T = with(prefs) { 
     val res: Any = when (default) { 
      is Long -> getLong(name, default) 
      is String -> getString(name, default) 
      is Int -> getInt(name, default) 
      is Boolean -> getBoolean(name, default) 
      is Float -> getFloat(name, default) 
      else -> throw IllegalArgumentException("This type can be saved into Preferences") 
     } 

     res as T 
    } 

    @SuppressLint("CommitPrefEdits") 
    private fun putPreference(name: String, value: T) = with(prefs.edit()) { 
     when (value) { 
      is Long -> putLong(name, value) 
      is String -> putString(name, value) 
      is Int -> putInt(name, value) 
      is Boolean -> putBoolean(name, value) 
      is Float -> putFloat(name, value) 
      else -> throw IllegalArgumentException("This type can't be saved into Preferences") 
     }.apply() 
    } 
} 

答えて

2

私はコードAを使用します。

私はコードBはもっとですimple、私はプライベートvalの郵便番号を使用することができますロング好みで(これは、ZIP_CODE、DEFAULT_ZIP)を呼び出すために、私は最初のケースでは、コードB

を使用するときにもDelegatesExt.*DelegatesExt.preferenceの代わりDelegatesExtをインポートし、by preferenceを書くことができます。

なぜクラスが必要なのですかオブジェクトをラップするのはなぜですか?

それはするを必要とする(と私はそれをしないだろう)ない、それはただ著者の好みです。

関連する問題