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

我可以为没有相应getter的Java setter使用属性语法吗?

陈俊郎
2023-03-14

我有一个带有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时,我得到一个错误< code > unresolved reference:name 。如果我添加了一个getter,错误就消失了,但是我能在Java中不定义getter的情况下使用setter作为属性吗?我知道我仍然可以从kotlin调用< code > p . set name(" example ")。

以上是 MCVE。现实世界的代码是一个Java构建器,其中包含setter,但不是我想从Kotlin中使用的getter,例如

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

共有1个答案

饶滨海
2023-03-14

不可以,Kotlin 编译器只有在存在与 setter 具有相同或更大可见性的 getter 时才会将其识别为属性。这是因为在 Kotlin 中没有没有 getter 的属性。(请参阅本节的最后一句。

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

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

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

对于构建者来说,另一种选择是创建一个扩展函数,其中包含您可以在其上设置的所有参数以及默认值。然后,您可以使用命名参数获得与< code>apply示例有些类似的语法。

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

 类似资料:
  • 嗨,我试图使用strut得到一个bean到我的jsp代码,我在我的jsp页面中使用的bean是:但是每当我运行jsp时,我就会收到 bean的“unitForm”的属性“testData.team.type”没有getter方法。 我正在尝试将棒球写入我的JSP页面。 我的行动表单的代码是: 测试数据类具有: 最后在我的体育课上:

  • 我正在尝试用Struts填充select。但是,我得到了一条错误消息:name在其所查找的类中也没有名为“label”的变量,因此我不知道它是如何查找 表单类是一个非常典型的实体类 关于为什么会出现这个错误,有什么建议吗?

  • 我在jsp文件中有这个,它可以工作: 但是我想显示一个html:选择像这样: 但不起作用,错误显示: 没有可用于属性认证的getter方法。名为org的bean的estado。阿帕奇。struts。塔格里布。html。豆 谢谢

  • Struts(1.38)新手,我得到以下错误:没有getter方法可用于名称hsForm下的bean的属性hs.has关系ToTeam。我被告知在HSDivForm中创建getHs和setHs方法,但这是问题所在吗?或者我该怎么做? 我的豆子: 我的表格: 我的jsp:

  • 对于bean中未定义实际属性的属性,使用getter方法是一种好的做法。例如,假设我有一个bean类,如下所示:websitebean: 让我们说,如果我正在使用这个类的strut工作如下:我ndex.jsp: 所以我的问题是:在jsp文件中使用这样的url是一种很好的做法,而我们在它后面没有任何属性绑定。我们是否看到了这方面的任何问题,或者像这样使用很好? 编辑:将返回类型更改为getUrl()

  • 如何使用自定义setter声明属性,但在Kotlin中没有getter?例如,在安科,他们这样做: 但在我看来,这有点骇人。这样做对吗?如果是,那么当一个项目没有Anko依赖关系时,情况会怎样呢? 附言:让我说清楚——我想没有吸气剂,而不是私人吸气剂