假设我有以下类(class):
class Person() {
var age: Pair<String, Int> = Pair("person_age", 23)
// override getValue and setValue here
}
现在,我想封装实际的
Pair
,只希望用户读/写该对的第二个值。是否有可能覆盖getValue
和setValue
方法,所以我可以这样做:val p = Person()
p.age = 25
if(p.age <= 30)
当然,我可以为每个属性编写自己的
getter
和setter
方法,但是关于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.first
,Pair.second
或destructured,例如: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 class
和var
来克服设置部分,但是再次,您实际上并没有从中获得任何 yield 。关于kotlin - 覆盖getValue和setValue以大写一对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51844386/