【问题标题】:kotlin class, I modify a list outside a class and it ends up modifying the value inside the classkotlin 类,我在类外修改了一个列表,它最终修改了类内的值
【发布时间】:2021-01-30 11:45:05
【问题描述】:

我试图创建一个具有列表值的类。创建对象后,我清理了类外的列表,但类内的列表也清除了

这里的代码有什么建议吗?

data class Profile(
    val links: List<Link>,
    val usersName : String,
    var profilePK : Int
)


profiles.add(
             Profile(
                 links,
                 cursor.getString(1),
                 auxProfilePK
                 )
             )
Log.i("BLE","Profile ID: "+profiles.last().profilePK.toString()+" LINK SIZE "+ profiles.last().links.size.toString())

links.clear()

Log.i("BLE","Profile ID: "+profiles.last().profilePK.toString()+" LINK SIZE "+ profiles.last().links.size.toString())

日志输出:
个人资料 ID:1 链接大小 1
个人资料 ID:1 链接大小 0

【问题讨论】:

  • 您需要使用list.toList()List(list) 创建列表的副本。更好的是,如果不需要的话,首先不要使用 MutableLists。

标签: android list class kotlin constructor


【解决方案1】:

原因是尽管您期望一个不可变列表,但数据类也接受可变列表 - 由于您仅在 Kotlin 和 Java 中复制引用,您仍然可以使用数据类之外的值。

为了使配置文件类成为它所传递的列表的唯一所有者,您需要将其复制到数据类的外部或内部。我建议您在配置文件类中执行此操作以正确封装此逻辑。复制方法可以在 init 块或辅助构造函数中完成。尽管只有主构造函数上的参数是默认 equals/toHash 的一部分,但数据类有一个问题。

因此,这里有一个关于配置文件类外观的建议,将主构造函数设为私有并拥有一个管理转换的辅助构造函数(可能有更好的选择,但这是一个开始):

data class Profile private constructor(val links: List<Link>,
                                       val usersName : String,
                                       var profilePK : Int) {
    constructor(usersName: String, profilePK: Int, outerLinks: List<Link>) : 
        this(outerLinks.toList(), usersName, profilePK)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多