Руководство по Kotlin @JvmField

Руководство по 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, поэтому его должно быть легко импортировать и запускать как есть.