【问题标题】:Right way to initialise SharedPreference in Kotlin在 Kotlin 中初始化 SharedPreference 的正确方法
【发布时间】:2019-02-05 20:45:02
【问题描述】:

我对 Kotlin 很陌生。以前,我曾经在活动中这样声明 SharedPreference:

class MainActivity extends AppCompatActivity {
    SharedPreferences main;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        main = getSharedPreferences("main", MODE_PRIVATE);
    }
}

这让我可以在全班使用main 实例。我想实现类似的功能。我目前正在使用lateinit var


class MainActivityKotlin : AppCompatActivity() {
    lateinit var main : SharedPreferences

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        main = getSharedPreferences("main", Context.MODE_PRIVATE)
    }
}

但我不确定这是否是正确的做法。 这也是var。据我了解,通常建议在实例不会更改的情况下使用val(就像在这种情况下,main 在初始化后不会更改)。那么这种做法正确吗?

【问题讨论】:

    标签: android kotlin sharedpreferences


    【解决方案1】:

    使用lateinit 非常好。毕竟,它就是为此目的而存在的。

    不过,您可以使用一种更简洁的解决方案:lazy-init:

    val main by lazy { getSharedPreferences("main", Context.MODE_PRIVATE) }
    

    这仅在首次引用main 时调用getSharedPreferences(),然后存储该实例。它类似于 Java 中的处理方式,但您不需要拆分行。

    【讨论】:

    • 看起来很完美。我也可以使用 val 而不是 var 使用这种方法。
    【解决方案2】:

    确实,val 更好。您可以通过延迟初始化获得一个:

    class MainActivityKotlin : AppCompatActivity() {
        private val sharedPrefs by lazy { getSharedPreferences("main", Context.MODE_PRIVATE) }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            /* initialisation is removed from here, as it is now lazy */
        }
    
        fun otherFunction() {
            // the first use of the shared preference will trigger its initialisation
            val prefInt = sharedPrefs.getInt("key", 0)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-24
      • 2019-10-03
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      相关资源
      最近更新 更多