当前位置: 首页 > 知识库问答 >
问题:

使用Kotlin属性访问语法设置Java字段安全吗

许马鲁
2023-03-14
javaFoo.setX(420)
javaFoo.x = 420

工作正常。

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

共有1个答案

辛承
2023-03-14

你对语言语义的分析是正确的。您描述的目标类上的更改确实会改变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
 类似资料:
  • 我正在尝试将我的Android项目切换到Kotlin。我有一个< code>EditText(一个< code>TextView的子类),我想以编程方式为它设置一个提示和文本。提示按预期工作。但是,对于文本,如果我尝试使用Kotlin setter语法,就会得到类型不匹配异常: 如果我们看一下声明,我们会发现从 继承的相同签名: 我的印象是 是 的快捷方式,但显然这种印象是错误的。 被视为普通方法

  • 我在将应用程序部署到tomcat时遇到问题。它以前可以工作,但我格式化了我的计算机,它停止了工作。 我的pom。xml: 这是错误: 注入构造函数时出错,java。lang.ExceptionInInitializerError:无法访问组织属性的默认字段。阿帕奇。专家插件。战争沃莫霍。(未知源)查找组织时。阿帕奇。专家插件。战争沃莫霍 我尝试过: https://www.programmerso

  • 如何避免对类的可选属性使用 我应该创建一个局部变量吗?我认为使用不是一个好的做法

  • 我想在使用Kotlin扩展函数时访问Java的私有字段。 假设我有一个Java类。ABC只有一个私有字段。我想用静态编程语言编写一个扩展函数,无论出于什么原因使用该字段。 Kotlin的功能是: 我得到的错误是: 无法访问“mPrivateField”:它在“ABC”中是专用的 有没有办法绕过这个限制?

  • 我用来自数据源的工作表填充数据创建一个工作簿,然后用该数据的透视表视图创建第二个工作表。一切都很好,但我似乎无法更改透视表的默认外观。我试图在创建透视表时选中设置(行标签-->从列表中单击一个-->字段设置-->小计-->无和行标签-->从列表中单击一个-->字段设置-->布局和打印-->“以表格形式显示项标签”),但在POI中找不到句柄/标志。尝试在pivottable.getCTPivotta

  • 我正在尝试从Java切换到Kotlin。但我有很多遗留代码和第三方库。我看到,Java类中经常存在没有getter和setter的公共字段,这些字段必须从其他类访问。如果没有Kotlin代码中的getter,我如何访问Java类的公共字段?