如何在 Kotlin 中重命名属性的支持字段



>编辑(再次):如果有人感兴趣,您可以在跟踪器上关注此问题。


编辑:我知道支持属性,它们将涵盖大多数用例。我不是在寻找解决方法,而是专门寻找是否有办法命名支持字段。


您可以轻松地重命名属性的 getter 和 setter,如下所示

@get:JvmName("getFancy")
@set:JvmName("setFancy")
var fancyProperty = ...

但是我无法弄清楚如何更改支持字段的名称,即使使用@field目标也是如此。

@field:JvmName("fancy")
var fancyProperty = ...

上面给出了一个错误:

此注释不适用于目标"具有支持字段的成员属性"和使用站点目标"@field">


最终我要做的是与JavaFX互操作。定义 JavaFX 属性时,通常遵循以下标准(使用一些附加代码使其延迟):

private ObjectProperty<Color> color = new SimpleObjectProperty<>(this, "color", DEFAULT_COLOR);
public ObjectProperty<Color> colorProperty() {
return color;
}
public Color getColor() {
return colorProperty.get();
}
public void setColor(Color color) {
colorProperty().set(color);
}

所以我要做的是这样的(尽管@field显然不起作用):

@field:JvmName("color")
@get:JvmName("colorProperty")
val colorProperty: ObjectProperty<Color> =
SimpleObjectProperty(this, "color", DEFAULT_COLOR)
var color
get() = colorProperty.get()
set(value) = colorProperty.set(value)

这将允许 FXML 的绑定功能(使用反射),遵循 Java 中的标准约定,并且仍然很好且易于使用。

在这种情况下,我不能使用支持属性,因为我需要color字段是ObjectProperty<Color>,但color的getter和setter应该是Color

幸运的是,JavaFX的反射足够聪明,仍然可以只使用@get:JvmName("colorProperty"),但是也有类似的情况,重叠的字段名称可以使用这种重命名。

不,这是不可能的。原因是,在某些情况下没有支持字段(因此没有此属性抽象)。

从 kotlin 示例中(不创建支持字段):

val isEmpty: Boolean
get() = this.size == 0

因此,需要备份属性解决方法。

最新更新