Intereting Posts
Прокрутка не работает во второй активности Kotlin – Maven не выполняет тесты Что значит ! означает значение возврата Котлина? В kotlin функция tailroid tail возвращает 0 Kotlin \ Java – Как получить сумму измененных элементов массива Преобразование может быть в одиночку из другого источника, если возможно завершено Kotlin: Коллекция не имеет ни общего типа, ни OneToMany.targetEntity () Как правильно сериализовать такой JSON с помощью GSON Android? Могу ли я запустить kotlin как скрипт с Java Scripting API Invoke RxJava2 отменяемый / одноразовый из правильной нити Что такое открытое свойство? Почему я не могу сделать свой сеттер частным? Общий код между сервером Kotlin и клиентскими проектами с использованием Gradle Издевательские общие интерфейсы с Kotlin и Mockito Android: Kotlin TypeCastException: null не может быть применено к ненулевому типу kotlin.String Spring Framework проглатывает исключение пользовательских преобразователей

При создании интерфейса в Kotlin имеет значение, если свойства get / set?

В интерфейсе Kotlin имеет значение, если свойства объявлены пустым оператором get / set?

Например…

interface ExampleInterface { // These... val a: String get var b: String get set // ...compared to these... val c: String var d: String } 

Мне трудно заметить разницу.

При реализации интерфейса это не имеет значения, если я использую getters / seters для свойств, или если я устанавливаю значение напрямую.

При доступе к ним через java, у val есть оба источника, а у var есть и получатели и сеттеры.

 public void javaMethod(ExampleInterface e) { e.getA(); e.getB(); e.setB(); e.getC(); e.getD(); e.setD(); } 

    Объявления свойств в вашем примере идентичны, get и set могут быть безопасно удалены оттуда, потому что, как вы правильно отметили, аксессоры генерируются в любом случае. Однако синтаксис с get и set может использоваться для обеспечения реализации доступа или для ограничения его видимости.

    • Обеспечение реализации:

       interface ExampleInterface { var b: String get() = "" set(value) { } } 

      В этом примере показана реализация по умолчанию свойства, объявленного в интерфейсе. Это свойство все еще может быть переопределено внутри реализаций интерфейса.

       class Example { var b: String = "" get() = "$field$field" } 

      Здесь get() = ... переопределяет поведение getter по умолчанию свойства с помощью поля поддержки, тогда как set не упоминается, поэтому он ведет себя нормально.

    • Ограничение видимости:

       class Example { var s: String = "s" private set } 

      В этом примере видимость сеттера является private . Видимость get всегда одинакова для видимости свойства, поэтому нет необходимости указывать ее отдельно. Интерфейсы не могут объявлять private члены.

       abstract class Example { abstract var b: String protected set // Restrict visibility } 

      Установщик этого свойства ограничен этим классом и его подклассами. Интерфейсы не могут объявлять protected члены.

    Конечно, реализация аксессуар может сочетаться с ограничением видимости:

     class Example { var s: String = "abc" private set(value) { if (value.isNotEmpty()) field = value } } 

    Смотрите также:

    • Справочная статья Kotlin о свойствах
    • Свойства видимости видимости в другом ответе