是可以安全使用科特林属性访问语法来设置一个Java领域

Belzebub:

这是一个假设性的问题。这种情况如下:我打电话从科特林文件中的Java类的setter方法来改变私有字段的值x

javaFoo.setX(420)

该IDE建议将其改为

javaFoo.x = 420

它正常工作。

现在假设二传手有它的一些复杂的功能里面,后来的xJava类中的字段将变为public代替private不会有任何编译错误,但科特林通话将改变的值x跳过发生在二传手其他的东西,它可以被忽视,造成逻辑错误。所以我想知道:是否可以安全使用科特林属性访问语法来设置一个java场?

马尔科Topolnik:

你的语言语义的分析是正确的。你描述的目标类的变化确实会改变科特林的属性访问语法的语义。然而,事实是不是唯一一个回答你的问题,它要求使用语法是否是时要考虑安全

当讨论假设情况没有任何现实生活的约束,相当多的东西是可能的,没有语言构造是“安全的”这一观点之下。如果,有一天,科特林队决定改变的语义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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从Java调用一个科特林高阶函数

科特林 - 无法使用“T”作为具体化类型参数。使用一个类来代替

如何检查如果一个类已经重写从科特林或Java使用反射的接口的默认方法?

在科特林XOR运算功能或一个错误?

如何申报科特林LAMBDA与一个java调用者返回类型“无效”?

如何基于功能接口科特林一个Java的拉姆达转换?

如何为Base64解码在科特林/ Java的一个numpy的阵列(Python)的?

建设有一个摇篮+科特林的Java项目9

实例化一个具体的Java类,它的用途在科特林递归仿制药

Androidx科特林使用GSON,需要创建一个嵌套GSON数据类

是否有一个相当于科特林Java的Collections.synchronizedList的?或者这是不是需要科特林

访问科特林密封类从Java

从一个公共方法的Java类继承在接受一个科特林级保护

如何声明与一个java调用者返回类型“无效”一科特林功能?

在Java中使用科特林库

从Java中使用科特林单

实例在科特林一个变量,只有当它是一个空?

如何通过从导航抽屉的菜单中选择一个项目来打开一个活动?[科特林]

重新启用的IntelliJ Java来科特林转换

科特林:如何观察一次在一个视图模型一个liveData?使用ObserveForever()和removeObserver()

如何通过一个科特林集合作为varagrs?

如何创建一个科特林MVVM实体类

不能创建一个抽象类随机科特林的实例

是否应科特林文件在Android的一个单独的源目录放?

为什么科特林接收到这样的UndeclaredThrowableException中,而不是一个ParseException?

如何创建一个固定大小IntArray后来在科特林初始化数组?

查找具有相同第一个元素的对的平均值。科特林

如何在科特林四舍五入一个数字

科特林:通过在科特林数据类设置在Java类的私人布尔。为什么我不能够做到这一点?