gpt4 book ai didi

java - 使用 Kotlin 属性访问语法设置 Java 字段是否安全

转载 作者:搜寻专家 更新时间:2023-11-01 03:16:08 25 4
gpt4 key购买 nike

这是一个假设性问题。情况如下:我正在从 Kotlin 文件调用 Java 类的 setter 来更改私有(private)字段 x

的值
javaFoo.setX(420)

IDE建议改成

javaFoo.x = 420

一切正常。

现在假设 setter 内部有一些复杂的功能,稍后 ​​Java 类中的 x 字段更改为 public 而不是 private。不会有编译错误,但 Kotlin 调用会更改 x 的值,跳过 setter 中发生的其他内容,并且它可能会被忽视,从而导致逻辑错误。因此我想知道:使用 Kotlin 属性访问语法设置 java 字段是否安全?

最佳答案

您对语言语义的分析是正确的。您描述的目标类的变化确实会改变 Kotlin 属性访问语法的语义。但是,在回答您的问题时要考虑的不仅仅是这一事实,该问题询问使用该语法是否安全

在讨论没有任何现实生活限制的假设场景时,几乎任何事情都是可能的,并且在这种观点下没有任何语言结构是“安全的”。如果有一天,Kotlin 团队决定将 x++ 的语义更改为“返回 x 的平方,而不是更改 x”,会怎样?从理论上讲,这是可能的。不过,这可能吗?

将相同的常识性逻辑应用于您的问题,类的维护者决定打破迄今为止隐藏在具有自定义逻辑的 setter 后面的字段的封装的情况极不可能发生。事实上,如果您对所有 Java 库项目进行历史分析,您可能找不到一个这样的实例。


就是说,您的假设场景可能会分散您对快捷语法实际问题的注意力。使用它来调用具有自定义逻辑的 setter 可能会很尴尬和误导,因为它打破了我们的直觉。

在 Android 上,一个这样的例子是 ImageView.get/setImageMatrix。你可以写

imageMatrix.rotate = 30

并期望它会产生效果,但实际上,您编写的代码已损坏。你实际上应该写

val tmpMatrix = Matrix()
tmpMatrix.set(imageMatrix)
tmpMatrix.rotate = 30
imageMatrix = tmpMatrix

根据我们的 Java 直觉,实际上是这个版本看起来有问题,似乎毫无意义地浪费了对象分配。但是,如果您阅读 setImageMatrix 的约定,您会发现它所做的不仅仅是将您的对象分配给一个字段,它实际上将转换应用于 ImageView 。同样,getter 的契约不允许改变返回的对象。


我没有看到关于 Kotlin 的这个特性的太多争论,但我认为它是从 Java 迁移的人们的潜在错误来源。要走的路是重新训练你的直觉,让自己意识到 Kotlin 中的任何属性访问可能意味着比看起来要多得多的事实。

关于java - 使用 Kotlin 属性访问语法设置 Java 字段是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51499141/

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