gpt4 book ai didi

kotlin - 覆盖getValue和setValue以大写一对

转载 作者:行者123 更新时间:2023-12-02 13:09:17 25 4
gpt4 key购买 nike

假设我有以下类(class):

class Person() {
var age: Pair<String, Int> = Pair("person_age", 23)
// override getValue and setValue here
}

现在,我想封装实际的 Pair,只希望用户读/写该对的第二个值。是否有可能覆盖 getValuesetValue方法,所以我可以这样做:
val p = Person()
p.age = 25

if(p.age <= 30)

当然,我可以为每个属性编写自己的 gettersetter方法,但是关于Kotlin的一件好事是,您必须编写更少的样板代码,然后这些代码会丢失。

最佳答案

以下内容可能已经足够:

class Person() {
var age : Int = 23 // public by default
private /* or internal */ fun toAgePair() = "person_age" to age // narrow visibility
}

因此,您所有的代码都会访问年龄,如下所示:
val p = Person()
p.age = 25
if (p.age <= 30) ...

但是,如果您需要 Pair,则只需执行以下操作即可:
p.toAgePair() // or skip that method and use: '"person_age" to p.age' instead

访问 Pair内容的替代方法是: Pair.firstPair.seconddestructured,例如:
val myPair = Pair("person_age", 23)
// myPair.second = 25 // setting will not work however
myPair.let { (name, age) -> /* do something with it */ }

或者:
val p = Person()
val (name, age) = p.toAgePair()
// age = 25 // setting will not work however (and it wouldn't set the actual value inside the Pair if it would contain vars)
if (age < 30) // accessing is OK

但是,如果我正确理解了您的信息,那么您就可以同时访问您可能不想使用的两个值。
您可以使用自己的 data classvar来克服设置部分,但是再次,您实际上并没有从中获得任何 yield 。

关于kotlin - 覆盖getValue和setValue以大写一对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51844386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com