1. Общий обзор
В этом руководстве мы рассмотрим аннотацию @JvmField в Kotlin.
В Kotlin свой подход к классам и свойствам, который отличается от подхода, используемого в Java. Аннотация @JvmField позволяет добиться совместимости между двумя языками.
2. Объявление поля
По умолчанию классы Kotlin предоставляют доступ не к полям, а к свойствам.
Язык автоматически предоставляет дополнительные поля для свойств, которые будут сохранять свои значения в виде поля:
class CompanionSample {
var quantity = 0
set(value) {
if(value >= 0) field = value
}
}
Это простой пример, но при использовании декомпилятора Kotlin в IntelliJ (Инструменты > Kotlin > Показать декомпилятор Kotlin) мы увидим, как это будет выглядеть в Java:
public class JvmSample {
private int quantity;
// custom getter
public final void setQuantity(int value) {
if (value >= 0) {
this.quantity = value;
}
}
}
Однако это не значит, что у нас вообще не может быть полей, есть определенные сценарии, где это необходимо. В этом случае мы можем использовать аннотацию @JvmField, которая предписывает компилятору не генерировать геттеры и сеттеры для свойства и предоставлять его в виде простого поля Java.
Давайте рассмотрим пример с Kotlin:
class KotlinJvmSample {
@JvmField
val example = "Hello!"
}
И его декомпилированный на Java аналог – что, действительно, доказывает, что поле было открыто стандартным способом Java:
public class KotlinJvmSample {
@NotNull
public final String example = "Hello!";
}
3. Статические переменные
Другой случай, когда аннотация может пригодиться, - это когда свойство, объявленное в объекте name или сопутствующем объекте, имеет статическое вспомогательное поле:
public class Sample {
public static final int MAX_LIMIT = 20;
}
class Sample {
companion object {
@JvmField val MAX_LIMIT = 20
}
}
4. Исключения из правил использования
До сих пор мы обсуждали ситуации, в которых мы можем использовать аннотацию, но есть некоторые ограничения.
Вот несколько ситуаций, в которых мы не можем использовать аннотацию:
- Частные свойства
- Свойства с модификаторами open, override, const
- Делегированные свойства
5. Заключение
В этой краткой статье мы рассмотрели различные способы использования аннотации @JvmField в Kotlin.
Оригинал статьи: https://www.baeldung.com/kotlin/jvm-field-annotation