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

时间:2018-02-03 18:01:17

标签: properties kotlin backing-field

编辑(再次):如果有人有兴趣,您可以follow this issue on the 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字段为ObjectProperty<Color>,但color的getter和setter应为{{1} }}

幸运的是,来自JavaFX的反射非常智能,只能使用Color,但是有类似的情况,重叠的字段名称可以使用此重命名。

1 个答案:

答案 0 :(得分:-1)

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

根据kotlin示例(不创建后备字段):

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

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