Привет, я новичок в мире Kotlin. Мне нравится то, что я вижу до сих пор, и начал думать о том, чтобы преобразовать некоторые из наших библиотек, которые мы используем в нашем приложении, из Java в Kotlin.
Эти библиотеки полны Pojos с сеттерами, геттерами и классами Builder. Теперь я погуглил, чтобы найти лучший способ реализации Builders в Kotlin, но безуспешно.
2-е обновление: вопрос в том, как написать шаблон проектирования Builder для простого pojo с некоторыми параметрами в Kotlin? Приведенный ниже код является моей попыткой написать код Java, а затем использовать eclipse-kotlin-plugin для преобразования в Kotlin.
class Car private constructor(builder:Car.Builder) {
var model:String? = null
var year:Int = 0
init {
this.model = builder.model
this.year = builder.year
}
companion object Builder {
var model:String? = null
private set
var year:Int = 0
private set
fun model(model:String):Builder {
this.model = model
return this
}
fun year(year:Int):Builder {
this.year = year
return this
}
fun build():Car {
val car = Car(this)
return car
}
}
}
design-patterns
kotlin
Keyhan
источник
источник
model
иyear
быть изменчивым? Вы меняете их послеCar
создания?Ответы:
Прежде всего, в большинстве случаев вам не нужно использовать компоновщики в Kotlin, потому что у нас есть аргументы по умолчанию и именованные аргументы. Это позволяет вам писать
и используйте это так:
Если вы абсолютно хотите использовать сборщики, вот как вы можете это сделать:
Делать Builder a
companion object
не имеет смысла, потому чтоobject
s - это одиночки. Вместо этого объявите его как вложенный класс (который является статическим по умолчанию в Kotlin).Переместите свойства в конструктор, чтобы экземпляр объекта можно было создавать обычным способом (сделайте конструктор частным, если это не нужно) и используйте вторичный конструктор, который принимает конструктор и делегирует первичному конструктору. Код будет выглядеть следующим образом:
Использование:
val car = Car.Builder().model("X").build()
Этот код может быть сокращен дополнительно с помощью построителя DSL :
Использование:
val car = Car.build { model = "X" }
Если некоторые значения являются обязательными и не имеют значений по умолчанию, вам нужно поместить их в конструктор компоновщика, а также в
build
метод, который мы только что определили:Использование:
val car = Car.build(required = "requiredValue") { model = "X" }
источник
Car.Builder builder = new Car.Builder();
. Однако только первая версия имеет свободный интерфейс, поэтому вызовы ко второй и третьей версиям не могут быть связаны.Один из подходов - сделать что-то вроде следующего:
Образец использования:
источник
Поскольку я использую библиотеку Джексона для анализа объектов из JSON, мне нужен пустой конструктор, и у меня не может быть необязательных полей. Также все поля должны быть изменяемыми. Затем я могу использовать этот красивый синтаксис, который делает то же самое, что и шаблон Builder:
источник
@JsonProperty
@JsonProperty
, если вы компилируете с-parameters
ключом.Лично я никогда не видел строителя в Котлине, но, возможно, это только я.
Вся необходимая проверка происходит в
init
блоке:Здесь я позволил себе догадаться, что ты на самом деле не хотел,
model
иyear
быть изменчивым. Также эти значения по умолчанию, кажется, не имеют смысла (особенноnull
дляname
), но я оставил одно для демонстрационных целей.Мнение: шаблон построителя, используемый в Java как средство существования без именованных параметров. В языках с именованными параметрами (например, Kotlin или Python) рекомендуется иметь конструкторы с длинными списками (возможно, необязательных) параметров.
источник
@JvmOverloads
kotlinlang.org/docs/reference/…Я видел много примеров, которые объявляют дополнительные забавы строителями. Мне лично нравится такой подход. Экономьте усилия, чтобы писать строителям.
Я еще не нашел способ, который может заставить некоторые поля инициализироваться в DSL, например, показывать ошибки, а не генерировать исключения. Дайте мне знать, если кто-нибудь знает.
источник
Для простого класса вам не нужен отдельный строитель. Вы можете использовать необязательные аргументы конструктора, как описал Кирилл Рахман.
Если у вас более сложный класс, то Kotlin предоставляет способ создания Groovy в стиле Builders / DSL:
Тип-Сейф Строители
Вот пример:
Пример Github - Строитель / Ассемблер
источник
Люди в наши дни должны проверить Type-Safe Builders от Kotlin .
Использование указанного способа создания объекта будет выглядеть примерно так:
Хороший пример использования «в действии» - это фреймворк vaadin-on-kotlin , в котором используются сборщики безопасных типов для сборки представлений и компонентов .
источник
Я опоздал на вечеринку. Я также столкнулся с той же дилеммой, если мне пришлось использовать шаблон Builder в проекте. Позже, после исследования, я понял, что это абсолютно не нужно, поскольку Котлин уже предоставляет именованные аргументы и аргументы по умолчанию.
Если вам действительно нужно реализовать, ответ Кирилла Рахмана - это надежный ответ о том, как реализовать наиболее эффективно. Еще одна вещь, которая может оказаться вам полезной, - это https://www.baeldung.com/kotlin-builder-pattern, которую вы можете сравнить и сравнить с Java и Kotlin по их реализации.
источник
Я бы сказал, что шаблон и реализация в Kotlin остаются практически такими же. Иногда вы можете пропустить это благодаря значениям по умолчанию, но для более сложного создания объектов, строители все еще являются полезным инструментом, который нельзя пропустить.
источник
Вы можете использовать необязательный параметр в примере kotlin:
затем
источник
источник
Я реализовал базовый шаблон Builder в Kotlin с помощью следующего кода:
И наконец
Ява:
Котлин:
источник
Я работал над проектом Kotlin, в котором был представлен API-интерфейс, используемый клиентами Java (которые не могут использовать языковые конструкции Kotlin). Нам пришлось добавить компоновщики, чтобы сделать их пригодными для использования в Java, поэтому я создал аннотацию @Builder: https://github.com/ThinkingLogic/kotlin-builder-annotation - это в основном замена аннотации Lombok @Builder для Kotlin.
источник