5

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


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


您可以像这样轻松地重命名属性的 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 中的标准约定,并且在 Kotlin 中仍然很好且易于使用。

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

幸运的是,来自 JavaFX 的反射足够智能,仍然可以仅使用@get:JvmName("colorProperty").,但是在字段名称重叠的类似情况下可以使用这种重命名。

4

1 回答 1

0

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

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

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

因此需要支持属性解决方法。

于 2018-08-15T22:53:28.940 回答