我可以对 Java setter 使用 属性 语法而没有对应的 getter 吗?
Can I use property syntax for a Java setter without a corresponding getter?
我有 Java class 和 setter,但没有 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。 真实世界 代码是一个 Java 构建器,带有 setter 但不是 getter,我想从 Kotlin 使用它,比如
val widget = WidgetBuilder().apply {
width = 1 // instead I need .setWidth(1)
height = 2
weight = 3
name = "my widget"
}.build()
不,如果 getter 具有与 setter 相同或更高的可见性,Kotlin 编译器只会将其识别为 属性。这是因为在 Kotlin 中没有 属性 而没有 getter 这样的东西。 (See last sentence in this section.)
Note that, if the Java class only has a setter, it isn't visible as a property in Kotlin because Kotlin doesn't support set-only properties.
您可以为此 class 手动编写扩展属性,使 属性 访问语法对您可用,尽管有些人可能认为具有非功能性 getter 对于 属性。但是您可以控制扩展属性的可见性,所以它可能没问题。
var WidgetBuilder.width: Int
@Deprecated("Getter is unsupported.", level = DeprecationLevel.ERROR)
get() = error("unsupported")
set(value) { setWidth(value) }
构建器的替代方法是创建一个扩展函数,其中包含您可能在其上设置的所有参数以及默认值。然后,您可以使用 named arguments 来获得类似于 apply
.
示例的语法
FWIW,在使用 Java 构建器时,我只是按预期使用链式方法调用。
我有 Java class 和 setter,但没有 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。 真实世界 代码是一个 Java 构建器,带有 setter 但不是 getter,我想从 Kotlin 使用它,比如
val widget = WidgetBuilder().apply {
width = 1 // instead I need .setWidth(1)
height = 2
weight = 3
name = "my widget"
}.build()
不,如果 getter 具有与 setter 相同或更高的可见性,Kotlin 编译器只会将其识别为 属性。这是因为在 Kotlin 中没有 属性 而没有 getter 这样的东西。 (See last sentence in this section.)
Note that, if the Java class only has a setter, it isn't visible as a property in Kotlin because Kotlin doesn't support set-only properties.
您可以为此 class 手动编写扩展属性,使 属性 访问语法对您可用,尽管有些人可能认为具有非功能性 getter 对于 属性。但是您可以控制扩展属性的可见性,所以它可能没问题。
var WidgetBuilder.width: Int
@Deprecated("Getter is unsupported.", level = DeprecationLevel.ERROR)
get() = error("unsupported")
set(value) { setWidth(value) }
构建器的替代方法是创建一个扩展函数,其中包含您可能在其上设置的所有参数以及默认值。然后,您可以使用 named arguments 来获得类似于 apply
.
FWIW,在使用 Java 构建器时,我只是按预期使用链式方法调用。