Найти тему

Путеводитель по Kotlin @JvmField

Оглавление

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