Intereting Posts
AndroidStudio / Kotlin – Неразрешенная ссылка: ReadWriteProperty – Kotlin версия 1.0.0-beta-1038 Написание JSP в kotlin с maven – Ошибка создания класса сервлета, ClassNotFoundException Обработчик комментариев Kotlin: он не может заставить его работать Флажок в Recycler Элемент View, если установлен в true, проверяется на наличие ложных срабатываний Как установить свойство lateinit Kotlin для null Как назначить новое значение, если вы устанавливаете setter private в kotlin? Kotlin by Lazy в пользовательских представлениях Почему объекты объекта не работают с неизменяемыми свойствами в Android Kotlin – Maven не выполняет тесты Каково использование emptyArray () в Котлине Как получить доступ к члену класса «статически» в котлин? стандартная двоичная функция maxBy Архитектура собственного SDK – API асинхронного метода в Котлине Ошибка комнаты в Android: TypeConverter не распознается для списка перечислений Ошибка «Нет определения класса def» при использовании OpenAM SDK через Kotin

Kotlin: set-ish setter, который возвращает «this»

Я знаю, что это не «строго по шаблону дизайна» бла-бла-бла, но …

В Котлине существует способ создания установщика «default-ish», который возвращает « this », например

 var foo:Bar = Something() set(f:Bar) { foo = f return this // Alas, that would not compile because Setter returns Unit } 

Это очень удобно, когда сеттер возвращает this , потому что затем может сделать шаблон Builder без объявления Builder. Это намного короче:

 BlahBlah().setFoo(x).setFoo2(y)... 

чем

 BlahBlah.Builder().setFoo(x).... 

или

 var b = BlahBlah() b.setFoo(x) b.setFoo2(y) ... 

Или что угодно

И, кроме того, если сеттер возвращает Unit любом случае, почему бы не this так же хорошо?

    У Kotlin есть хорошая документация о том, как создавать безопасные типы шрифтов . Установщики в Котлине вызываются как

     receiver.property = value 

    Возврат this из метода setter поможет только в том случае, если код используется с Java. Сказав, что сеттер Котлин должен вернуть Unit . Даже без специализированного строителя типичная задача установки нескольких свойств объекта гораздо более кратка в Котлине:

     class BlahBlah { var name = "John" var age = 12 } BlahBlah().apply { name = "Sarah" age = 10 } 

    Посмотрите, как реализовать шаблон Builder в Котлине?

    Существует не встроенный механизм, но вы можете использовать методы автоматического написания методов самовозвращения:

     class Foo { var bar: Bar fun bar(b: Bar) = apply { bar = b } } 

    Нет, это невозможно: сеттеры Котлина возвращают единицу по проекту.

    Шаблон Builder существует для преодоления проблемы, когда увеличение комбинаций параметров конструктора приводит к экспоненциальному списку конструкторов. В Котлине эта проблема решена с использованием значений параметров по умолчанию:

     data class Foo( val a1: String = "a1", val a2: String = "a2" ) 

    Вместо использования шаблона Builder теперь вы можете легко пропустить параметры, назвав их:

     val foo = Foo(a1 = "bar") 

    Если вы действительно хотите иметь какой-то Builder:

     class FooBuilder { var a1: String = "a1" var a2: String = "a2" fun build() = Foo(a1, a2) } val foo = FooBuilder().apply { a1 = "bar" }.build() 

    Однако для этого требуется намного больше кода.