为何值相等的Kotlin TornadoFX属性对象用==比较结果为0?
为什么值相等的两个Property对象用
==比较会返回不相等? 先看你给出的代码和输出:
println(costTable[1].numberGoodProperty) println(SimpleIntegerProperty(objC.number)) val max11 = if (costTable[1].numberGoodProperty == SimpleIntegerProperty(objC.number)) 1 else 0 println("max11 $max11")
输出结果:
IntegerProperty [value: 2] IntegerProperty [value: 2] max11 0
核心问题:==比的是对象引用,不是属性值
在Kotlin(结合JavaFX的底层逻辑)里,==对于引用类型的默认行为是比较两个对象是不是同一个内存实例,而不是它们内部存储的数值。
你这里的costTable[1].numberGoodProperty是已经存在的一个IntegerProperty对象,而SimpleIntegerProperty(objC.number)是你新创建的另一个完全独立的对象——哪怕它们的value都是2,这俩在内存里是完全不同的两个实例,所以用==比较时自然会返回false,最终max11就变成了0。
正确的比较姿势
如果要判断两个Property的数值是否相等,有两种常用方法:
- 直接取它们的
value来比较:
val max11 = if (costTable[1].numberGoodProperty.value == SimpleIntegerProperty(objC.number).value) 1 else 0
- 用Property自带的
isEqualTo()方法(这是JavaFX为属性类专门提供的数值比较方法):
val max11 = if (costTable[1].numberGoodProperty.isEqualTo(SimpleIntegerProperty(objC.number)).value) 1 else 0
注意isEqualTo()返回的是一个BooleanBinding,所以要加.value拿到最终的布尔结果。
另外,如果你只是想和objC.number这个数值对比,其实完全没必要新建SimpleIntegerProperty,直接写更简洁:
val max11 = if (costTable[1].numberGoodProperty.value == objC.number) 1 else 0
额外提一句:Kotlin里==和===的区别
Kotlin的===是严格比较对象的内存地址,和Java的==完全一致;而Kotlin的==默认会调用对象的equals()方法,但JavaFX的Property类并没有重写equals(),所以它的equals()还是在比较引用地址——也就是说,不管你用==还是===,只要不是同一个Property实例,结果都是false。
内容的提问来源于stack exchange,提问作者ky8585
相关产品推荐
相关产品推荐

