微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以在没有相应 getter 的情况下对 Java setter 使用属性语法吗?

如何解决我可以在没有相应 getter 的情况下对 Java setter 使用属性语法吗?

我有一个带有 setter 的 Java 类,但没有属性的 getter。

class Person {
  private String name;
  public void setName(String name) { this.name = name; }
}

我想使用 .name= 从 Kotlin 分配给它

fun example() {
  val p = Person()
  p.name = "example"
}

我在尝试编译 Kotlin 时遇到错误 unresolved reference: name。如果我添加 getter,错误就会消失,但是我可以将 setter 用作属性而不用在 Java 中定义 getter 吗?我知道我仍然可以从 kotlin 调用 p.setName("example")

以上是MCVE。 现实世界代码一个带有setter而不是getter的Java构建器,我想在Kotlin中使用它,比如

val widget = WidgetBuilder().apply {
  width = 1  // instead I need .setWidth(1)
  height = 2
  weight = 3
  name = "my widget"
}.build()

解决方法

不,Kotlin 编译器仅在存在与 setter 具有相同或更高可见性的 getter 时才将其识别为属性。这是因为在 Kotlin 中没有没有 getter 的属性。 (See last sentence in this section.)

请注意,如果 Java 类只有一个 setter,它在 Kotlin 中作为属性不可见,因为 Kotlin 不支持 set-only 属性。

您可以为此类手动编写扩展属性,使您可以使用属性访问语法,尽管有些人可能会认为为属性设置非功能性 getter 是一种反模式。但是您可以控制扩展属性的可见性,因此可能没问题。

var WidgetBuilder.width: Int
    @Deprecated("Getter is unsupported.",level = DeprecationLevel.ERROR)
    get() = error("unsupported")
    set(value) { setWidth(value) }

构建器的替代方法是使用您可能在其上设置的所有参数以及默认值制作单个扩展函数。然后,您可以使用 named arguments 获得与 apply 示例有些相似的语法。

FWIW,在使用 Java 构建器时,我只是按预期使用链式方法调用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?