Руководство по 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.
Давайте посмотрим на пример Котлина:
class KotlinJvmSample {
@JvmField
val example = "Hello!"
}
И его Java-декомпилированный аналог - который действительно доказывает, что поле было открыто стандартным способом Java:
public class KotlinJvmSample {
@NotNull
public final String example = "Hello!";
}
3. Статические переменные
Другой случай, когда аннотация оказывается полезной, это когда свойство, объявленное в объекте имени или объекте-компаньоне, имеет статическое поле поддержки:
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.
Реализация всех этих примеров и фрагментов кода можно найти вGitHub project - это проект Maven, поэтому его должно быть легко импортировать и запускать как есть.