Свойства частной строки в декомпилированном виде допускают значение NULL. java class Kotlin - PullRequest
3 голосов
/ 07 мая 2020

Когда у меня есть частное свойство String в классе Kotlin и я декомпилирую класс в код Java, это свойство не будет иметь аннотации @NotNull. Напротив, если я объявлю свойство String «publi c», оно будет иметь аннотацию @NotNull в декомпилированном коде.

Вот пример .kt:

   class Boo {

      private var  myString : String = ""
      var myOtherString : String = ""

   }

и декомпилированный. java эквивалент:

public final class Boo {
   private String myString = "";
   @NotNull
   private String myOtherString = "";

   @NotNull
   public final String getMyOtherString() {
      return this.myOtherString;
   }

   public final void setMyOtherString(@NotNull String var1) {
      Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
      this.myOtherString = var1;
   }

}

Почему @NotNull не требуется для частных свойств String?

1 Ответ

1 голос
/ 07 мая 2020

Подумайте иначе: в чем преимущество предоставления @NotNull в свойстве publi c (а не, например, сокрытия всей информации в @Metadata)? Это не имеет никакого значения для среды выполнения JVM; основное преимущество - это документация для пользователей класса и их инструментов, поэтому они знают, что getMyOtherString никогда не возвращает null. Но они не могут получить доступ к myString в первую очередь, поэтому нет смысла аннотировать его.

Это не совсем отвечает, почему поле myOtherString аннотировано, а не просто геттер и сеттер; Я предполагаю, что это потому, что его можно раскрыть с помощью @JvmField, поэтому в некоторых случаях необходимо написать код, который аннотирует его, и было немного удобнее не проверять, отображается ли поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...