Intereting Posts
Проблема генериков Котлина kotlin 'onCreate' ничего не отменяет Kotlin: Невозможно импортировать по требованию из объекта Предупреждение компилятора при использовании аннотации @Value в проекте Kotlin как вы получаете Idlingresource для работы в Kotlin с сопрограммами NotificationManager.setInterruptionFilter не работает для определенного телефона Как я могу получить ссылку на объект Kotlin по имени? Как пропустить модели proguard, используемые retrofit2, которые находятся на базовом пакете? Параметр типа Ketlin reified не используется Основание libgdx не работает Цикл бесконечности Котлина в списке в рекурсии OnClickItemListener в spinner в андроиде просмотра recycler ClassCastException: android.inputmethodservice.KeyboardView не может быть добавлен в com.support.mukhtar.simplekeyboard.CustomKeyboardView android Правильный способ получить свойства с конфигурацией Kotlin-script для Gradle Ошибка: выполнение выполнено для задачи ': app: compileDebugKotlin'. > Ошибка компиляции. Подробнее см. Журнал

При создании интерфейса в 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 о свойствах
    • Свойства видимости видимости в другом ответе