Как переименовать поле собственности в Котлине

РЕДАКТИРОВАТЬ (снова): Если кому-то интересно, вы можете следить за этой проблемой на трекере.


РЕДАКТИРОВАТЬ: Я знаю о вспомогательных свойств и что они будут охватывать большинство случаев использования. Я не ищу обходной путь, я специально ищу, есть ли способ назвать вспомогательное поле.


Вы можете легко переименовать метод получения и установки свойства, например, так

@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 должен быть Color,

К счастью, отражение от JavaFX достаточно умен, чтобы по-прежнему работать только с @get:JvmName("colorProperty"), но есть похожие ситуации с перекрывающимися именами полей, которые могут использовать это переименование.

1 ответ

Нет, это невозможно. Причина в том, что есть случаи, когда нет вспомогательного поля (и, следовательно, это свойство абстракция).

Из примеров kotlin (не создает вспомогательного поля):

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

Отсюда необходимость обходного пути для защитных свойств.

Другие вопросы по тегам