为什么需要类Preference 被对象包装?

以下代码A来自https://github.com/antoniolg/Kotlin-for-Android-Developers/blob/master/app/src/main/java/com/antonioleiva/weatherapp/extensions/DelegatesExtensions.kt

我可以使用private var zipCode: Long by DelegatesExt.preference(this, ZIP_CODE, DEFAULT_ZIP)在我使用代码A时调用。

我不明白为什么作者用对象DelegatesExt包装类偏好(…)

我认为代码B更简单,我可以使用private val zipCode: Long by Preference(this, ZIP_CODE, DEFAULT_ZIP)来调用我使用代码B

为什么需要类包含对象的首选项?

代码A

 object DelegatesExt { fun  notNullSingleValue() = NotNullSingleValueVar() fun  preference(context: Context, name: String, default: T) = Preference(context, name, default) } class NotNullSingleValueVar { 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(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 { 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(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() } } 

我可以使用私有variableszipCode:Long由DelegatesExt.preference(this,ZIP_CODE,DEFAULT_ZIP)在我使用代码A时调用。

我认为代码B更简单,我可以使用私有val zipCode:Long by Preference(this,ZIP_CODE,DEFAULT_ZIP)来调用我使用代码B

在第一种情况下,您还可以导入DelegatesExt.*DelegatesExt.preference而不是DelegatesExt并按照by preference编写。

为什么需要类包含对象的首选项?

它不需要(我不会这样做),这只是作者的偏好。