Как переименовать поле собственности в Котлине
РЕДАКТИРОВАТЬ (снова): Если кому-то интересно, вы можете следить за этой проблемой на трекере.
РЕДАКТИРОВАТЬ: Я знаю о вспомогательных свойств и что они будут охватывать большинство случаев использования. Я не ищу обходной путь, я специально ищу, есть ли способ назвать вспомогательное поле.
Вы можете легко переименовать метод получения и установки свойства, например, так
@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
Отсюда необходимость обходного пути для защитных свойств.