这是一个假设性的问题。这种情况如下:我打电话从科特林文件中的Java类的setter方法来改变私有字段的值x
javaFoo.setX(420)
该IDE建议将其改为
javaFoo.x = 420
它正常工作。
现在假设二传手有它的一些复杂的功能里面,后来的x
Java类中的字段将变为public
代替private
。不会有任何编译错误,但科特林通话将改变的值x
跳过发生在二传手其他的东西,它可以被忽视,造成逻辑错误。所以我想知道:是否可以安全使用科特林属性访问语法来设置一个java场?
你的语言语义的分析是正确的。你描述的目标类的变化确实会改变科特林的属性访问语法的语义。然而,事实是不是唯一一个回答你的问题,它要求使用语法是否是时要考虑安全。
当讨论假设情况没有任何现实生活的约束,相当多的东西是可能的,没有语言构造是“安全的”这一观点之下。如果,有一天,科特林队决定改变的语义x++
意味着“回归x
平方,不改变x
”?从理论上讲,这是可能的。它是有可能的,但?
运用同样的常识性的逻辑,你的问题,其中一类的维护者决定打破迄今已隐藏的自定义逻辑二传手背后场的封装方案的可能性微乎其微。事实上,如果你把所有的Java库项目的历史分析,你可能不会发现这已经发生过的单个实例。
这就是说,你假设的情况可以被看作是从与快捷语法的实际问题分心。它可以是尴尬和误导性用它来调用自定义逻辑二传手,因为它打破了我们的直觉。
在Android上,一个这样的例子是ImageView.get/setImageMatrix
。你可以写
imageMatrix.rotate = 30
并期待有效果,但实际上,你写的代码被打破。你实际上应该已经写
val tmpMatrix = Matrix()
tmpMatrix.set(imageMatrix)
tmpMatrix.rotate = 30
imageMatrix = tmpMatrix
通过我们的Java的直觉,它实际上是这个版本看起来坏了,浪费了一个对象分配的貌似没有任何意义。但是,如果你读的合同setImageMatrix
,你会发现它确实相当多的不只是你的分配对象的字段,它实际上适用改造图像视图。同样地,吸气的合同不允许变异返回的对象。
我还没有看到太多争论了科特林的这个功能,但我认为这是错误的乡亲从Java迁移的潜在来源。要走的路就是重新训练自己的直觉,敏感自己的事实,在科特林任何属性访问可能意味着很多比满足眼睛。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句