【问题标题】:How to use a property from a constructor inside an instance method in Kotin?如何在 Kotlin 的实例方法中使用构造函数中的属性?
【发布时间】:2020-06-13 08:08:19
【问题描述】:

这是我的代码。

class Repository(context: Context) {

    // Can access 'context' from here
    val mSharedPrefsProperties = context
        .getSharedPreferences(context.packageName.plus(".properties"), Context.MODE_PRIVATE)

    // Can't access 'context' in this function (unresolved reference: context)
    private fun getApiKey(): String {
        val apiKeys = context.resources.getStringArray(R.array.api_keys)
        val random = Random().nextInt(apiKeys.size)
        return apiKeys[random]
    }
}

有没有办法从函数内部的构造函数访问属性,还是我需要将它们设为实例/局部变量?

【问题讨论】:

    标签: android kotlin constructor scope instance-variables


    【解决方案1】:

    只需将var(或val)放在参数上

    class Repository(var context: Context) {
    
        // Can access 'context' from here
        val mSharedPrefsProperties = context
            .getSharedPreferences(context.packageName.plus(".properties"), Context.MODE_PRIVATE)
    
        // Can't access 'context' in this function (unresolved reference: context)
        private fun getApiKey(): String {
            val apiKeys = context.resources.getStringArray(R.array.api_keys)
            val random = Random().nextInt(apiKeys.size)
            return apiKeys[random]
        }
    }
    

    【讨论】:

    • 哈哈原来如此简单!谢谢!顺便说一句,将 var/val 放在构造函数属性上和将其留空有什么区别?
    • @appersiano 我同意你的看法,实际上我认为上下文在 Repository 类中应该是不可变的,所以我会选择 val
    【解决方案2】:

    简单的构造函数参数不会成为类的属性。只有明确地将它们设为varval 才会发生这种情况。不过,您可以在与初始化相关的任何内容中访问这些简单的参数,例如:

    class ConstWithArg(param1: String) {
        init {
            println(param1)
        }
    
        val field1 = param1.length
        var field2 = param1.length
    
    }
    

    如果您需要在构造后访问参数,则应通过将其设为val 将其变为属性。如果您不希望其他人在您的班级之外访问此字段,请将其标记为私有:

    class ConstWithArg(private val param1: String) {
    
        fun useProp(){
            println(param1)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多