android - 在 Kotlin 构造函数参数中什么情况下需要 val/var?

标签 android kotlin

正确的代码:

class MainActHandler(val weakActivity: WeakReference<Activity>): Handler() {
    override fun handleMessage(msg: Message?) {
        val trueAct = weakActivity.get() ?: return
        if (msg?.what == ConversationMgr.MSG_WHAT_NEW_SENTENCE){
            val sentence = msg.obj as String?
            trueAct.conversation.text = sentence
        }
        super.handleMessage(msg)
    }
}

无法解析的代码:

class MainActHandler(weakActivity: WeakReference<Activity>): Handler() {
    override fun handleMessage(msg: Message?) {
        val trueAct = weakActivity.get() ?: return
        if (msg?.what == ConversationMgr.MSG_WHAT_NEW_SENTENCE){
            val sentence = msg.obj as String?
            trueAct.conversation.text = sentence
        }
        super.handleMessage(msg)
    }
}

cannot be resolved code screenshot

唯一的区别是“val”已被删除,无法解析。

重要的是它是一个内部类。

但是

在构造函数参数中没有“val/var”的这个类正在工作:

class BookInfo(convrMgr: ConversationMgr, id: String, queue: RequestQueue, queueTag:String) {

val TAG = "BookInfo"
var title: String? = ""

init {
    val url = "https://api.douban.com/v2/book/$id"
    // Request a string response from the provided URL.
    val stringRequest = StringRequest(Request.Method.GET, url,
            Response.Listener<String> { response ->
                Log.d(TAG + " Response", response.substring(0))
                // Parse JSON from String value
                val parser = Parser()
                val jsonObj: JsonObject =
                        parser.parse(StringBuilder(response.substring(0))) as JsonObject
                // Initial book title of book properties.
                title = jsonObj.string("title")
                Log.d(TAG + " Book title", title)
                convrMgr.addNewMsg(title)
            },
            Response.ErrorListener { error -> Log.e(TAG + " Error", error.toString()) })
    // Set the tag on the request.
    stringRequest.tag = queueTag
    // Add the request to the RequestQueue.
    queue.add(stringRequest)
}

}

如果我在 "queue: RequestQueue"之前添加 var/val,我会得到建议:

“构造函数参数永远不会用作属性。此检查报告可以删除 'val' 或 'var' 的主要构造函数参数。在主要构造函数中不必要地使用 'val' 和 'var' 会消耗不必要的内存。”

我只是对此感到困惑。

最佳答案

当您在构造函数中编写 val/var 时,它会在类中声明一个属性。当您不编写它时,它只是传递给主构造函数的参数,您可以在其中访问 init block 中的参数或使用它来初始化其他属性。例如,

class User(val id: Long, email: String) {
    val hasEmail = email.isNotBlank()    //email can be accessed here
    init {
        //email can be accessed here
    }

    fun getEmail(){
        //email can't be accessed here
    }
}

Constructor parameter is never used as a property

这个建议是说你不要在初始化之外使用这个属性。因此,它建议您从类中删除此属性。

关于android - 在 Kotlin 构造函数参数中什么情况下需要 val/var?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45821929/

相关文章:

android - 将 viewModel 注入(inject)@Composable

java - 在应用程序中的每个 Activity 上显示相同的 TextView/"permanent"textView?

android - 在android中创建存储图像的数据库

android - 如何从 html 链接启动 Android 服务?

android - 在不同的 Android Activity 中暂停主要背景音乐

kotlin - 库模式中的Kotlin Flow

java - Gradle 不在命令行上执行任何测试

android - 即使应用程序卸载后,WorkManager 实例仍保持 Activity 状态(?)

java - Android (Kotlin) 与非字符串基元类型的双向数据绑定(bind)

android - 如何在 Android 8.0 (Oreo) 中以编程方式关闭 wifi 热点(setWifiApEnabled 不再支持此版本)