当前位置: 首页 > 知识库问答 >
问题:

为什么 Val 属性可以在 Kotlin 中更改?

於炯
2023-03-14

代码B是一个定制的回收视图apater,带有单选按钮。

mCustomAdapter 在 Code A 中的 fun methodA() 和 fun methodB() 中都发生了变化,因此 get () = mCustomAdapter.getSelectedIndex() 的引用也发生了变化,这意味着 val 属性 mySelectedIndex 从不同的地址获取值。

在我看来,val属性不能更改,为什么应用程序不会导致错误?

代码A

private lateinit var mCustomAdapter: CustomAdapter

private val mySelectedIndex get () = mCustomAdapter.getSelectedIndex()

private fun methodA(){
  mCustomAdapter= CustomAdapter(allListA)
  mRecyclerView.adapter= mCustomAdapter
  backup(mySelectedIndex)
}


private fun methodB(){
  mCustomAdapter= CustomAdapter(allListB)
  mRecyclerView.adapter= mCustomAdapter
  restore(mySelectedIndex) 
}

代码B

class CustomAdapter (val backupItemList: List<MSetting>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

    val noRecord=-1
    private var mSelectedIndex = noRecord

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomAdapter.ViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.item_recyclerview, parent, false)
        return ViewHolder(v)
    }

    fun getSelectedIndex():Int{
        return  mSelectedIndex
    }

    fun setSelectedIndex(index:Int){
        if (index in 0..(backupItemList.size-1) ){
            mSelectedIndex=index
        }
        notifyDataSetChanged();
    }

    override fun onBindViewHolder(holder: CustomAdapter.ViewHolder, position: Int) {
        holder.bindItems(backupItemList[position])
    }

    override fun getItemCount(): Int {
        return backupItemList.size
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        fun bindItems(aMSetting: MSetting) {          

            itemView.radioButton.setOnClickListener {
                mSelectedIndex=adapterPosition
                notifyDataSetChanged();
            }

            if(adapterPosition == 0 && mSelectedIndex == noRecord) {            
                itemView.radioButton.isChecked = true
                mSelectedIndex=adapterPosition
            }
            else {
                itemView.radioButton.isChecked =(adapterPosition == mSelectedIndex)
            }
        }

    }

}

被改进的

我觉得代码DD和代码EE可以达到同样的效果吧?

代码DD

var aImpl = 0
val a: Int get() = aImpl

fun seta(){
    aImpl=5
}

代码 EE

var b:Int=0

fun setb(){
    b=5
}

共有3个答案

华景同
2023-03-14

关于属性,关键字<code>val</code>意味着该属性没有setter,这意味着您不能对其使用赋值运算符<code>=。这并不意味着返回值必须随时间保持不变。

施飞雨
2023-03-14

val属性每次调用时都可以返回不同的值,如下所示:

private var aImpl = 0
val a: Int get() = aImpl++

由于< code > mcustomadapter . getselectedindex()的返回值在变化,因此< code>mySelectedIndex显然也在变化。

巫煌
2023-03-14

在我看来,val属性不能更改,为什么应用程序不会导致错误?

你必须调整你的直觉。

在Kotlin中,val表示“只读属性”,而不是“不可变属性”。只有没有自定义getter的VAL才能被认为是不可变的。

 类似资料:
  • 问题内容: 例如: Java: 科特林: 我以为它将转换为Java字节码。 问题答案: 这似乎是一个已知的问题在这里。显然,这是一件复杂的事情,不太可能很快解决。 来自安德烈·布雷斯拉夫的原始答复: 不幸的是,这是一个相当深的问题。我们不太可能以您想要的方式使其工作 在问题页面的更下方,您可以看到它在多平台项目方面变得更加复杂。

  • 我看到一些教程建议在Kotlin中使用val而不是var。我相信val在Java中就像常量,对吗?那么,如果建议使用它而不是var,我们如何更改它的值? 更新:例如:为什么我要使用val而不是var声明类成员(变量或字段)?而在Java中,它就像:

  • 在“Kotlin in Action”中,它说“如果一个成员属性引用了Person类的年龄属性,memberProperty.get(person)是一种动态获取person.age值的方法”,代码为(10.2.1 Kotlin Reflection API): 我不明白为什么这个例子提到“动态”获取属性的值。当我运行以下代码时,它才起作用: 是否有其他成员属性反射的案例或示例?

  • 在Kotlin文档中,我们只有以下几个字。 只读局部变量使用val关键字声明。可变局部变量使用var关键字声明。 这个问题不仅是让我们理解单词的意思,也是提醒单词制造者告诉我们他们为什么给这个单词命名,这不是一件小事,这会让我们更舒服地学习新知识,我们想学习和理解一切。

  • 我不明白为什么在Kotlin的类外写函数是可能的?这是个好做法吗?