Kotlin 我可以为没有相应getter的Java setter使用属性语法吗?
我有一个带有setter的Java类,但没有属性的getterKotlin 我可以为没有相应getter的Java setter使用属性语法吗?,kotlin,kotlin-java-interop,kotlin1.4,Kotlin,Kotlin Java Interop,Kotlin1.4,我有一个带有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时遇到一个错误未解析的引用:name。
class Person {
private String name;
public void setName(String name) { this.name = name; }
}
我想使用.name=
从Kotlin分配给它
fun example() {
val p = Person()
p.name = "example"
}
我在编译Kotlin时遇到一个错误未解析的引用:name
。如果我添加一个getter,错误就会消失,但是我可以将setter用作属性而不在Java中定义getter吗?我知道我仍然可以从kotlin调用p.setName(“示例”)
以上是MCVE。真实世界的代码是一个Java构建器,带有setter,但没有getter,我想从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的属性。() 请注意,如果Java类只有一个setter,那么它在Kotlin中不作为属性可见,因为Kotlin不支持仅设置属性
您可以手动为该类编写扩展属性,使属性访问语法对您可用,尽管有些人可能认为它是反模式来对属性具有非功能的吸气剂。但是,您可以控制扩展属性的可见性,因此这可能没问题
var WidgetBuilder.width: Int
@Deprecated("Getter is unsupported.", level = DeprecationLevel.ERROR)
get() = error("unsupported")
set(value) { setWidth(value) }
构建器的另一种选择是创建一个扩展函数,其中包含所有可能设置的参数以及默认值。然后,您可以使用apply
获得与示例类似的语法
FWIW,我只是在使用Java构建器时按预期使用链式方法调用。您能将getter标记为已弃用,以发出更强烈的警告不要使用它吗?@gidds好主意,我补充道。然后尝试使用它将发出编译器警告。