假设我有以下类(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/

10-13 03:45