Tag: 不变性

我可以更新深层嵌套的不可变对象,而不必知道它的上下文吗?

让我们想象我有一个嵌套的不可变对象图,沿着这些线(使用Kotlin语法,但希望很清楚): data class House(val bedroom: Bedroom, val bathroom: Bathroom, val kitchen: Kitchen) class Bedroom class Bathroom data class Kitchen(val oven: Oven, val kettle: Kettle) class Oven data class Kettle(val on: Boolean) var house = House(Bedroom(), Bathroom(), Kitchen(Oven(), Kettle(false))) 现在,我想打开水壶。 如果对象是可变的,我只会写: data class Kettle(var on: Boolean) { fun activate() { this.on = true } } house.kitchen.kettle.activate() […]

为什么房间实体不能在Android中使用不可变属性

我一直在探索房间数据库对象映射库,我觉得奇怪。 正如这个答案所暗示的,实体数据模型不能具有不可变属性。 但我检查了谷歌与kotlin持久的例子 , Room工程与不可改变的属性。 请从示例中检查这个数据类。 什么可能是这种行为的原因? 如果我们可以创建不可变的值( val属性),这可能是一个很好的function,因为这限制了程序员在创建对象之后更改唯一标识符(如id)。

Kotlin:val,或者可以设置一次的var

只是好奇:在Kotlin,我很想得到一些可以被懒惰初始化的val,但是有一个参数。 那是因为我需要一些很晚才创建的东西来初始化它。 具体来说,我希望我有: private lateinit val controlObj:SomeView 要么: private val controlObj:SomeView by lazy { view:View->view.findViewById(…)} 接着: override fun onCreateView(….) { val view = inflate(….) controlObj = view.findViewById(…) 或者在controlObj.initWith(view)情况下controlObj.initWith(view)或类似的东西: return view 我不能by lazy使用by lazy因为by lazy不会接受初始化时要使用的外部参数。 在这个例子中 – 包含的view 。 当然,我有lateinit var但如果我能确保它只是在设置后才能读取,我可以在一行中完成。 是否有一个非常干净的方法来创建一个只读的variables,只初始化一次,但只有当其他一些variables出生? 任何init once关键字? 在init之后,编译器知道它是不可变的? 我意识到潜在的并发问题,但如果我敢于在init之前访问它,我当然应该被抛出 。

Swift到Kotlin,管理一成不变的名单

我试图移植一个现有的Swift代码给Kotlin,我想使用以下Swift代码的最佳做法: struct Deck { private(set) var cards: [Card] var cardsCount: Int { return self.cards.count } init(cards: [Card] = []) { self.cards = cards } mutating func add(card: Card) { self.cards.append(card) } } 设计目标是: cards属性在类之外是不可修改的,所以它的types应该是List fun add(card: Card)应该修改内部cards列表 有没有一种方法来实现这个Kotlin没有使用两个单独的属性 – 一个private var mutableCards: MutableList和一个计算属性val cards: List get() = this.mutableCards 对于这种情况,我需要一些最佳实践。