Kotlin Builder模式:带代码的分步指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么Kotlin中的Builder不仅仅是Java的“复制粘贴”?



如果你曾经用Java写过代码,你肯定遇到过经典的Builder模式。几十行代码、内部静态类、set方法和最终的build()方法。这些都能工作,但看起来非常臃肿。



现在想象一下,你转到了Kotlin。这门语言的设计初衷就是简洁和富有表现力。这时你遇到了一个任务:需要创建一个包含多个参数的对象,其中一部分是可选参数。你的手不自觉地想要写出Java中的经典Builder……



打住! 在Kotlin中,这个模式可以以十倍更简单、更优雅、更安全的方式实现。在本文中,我们将探讨在Kotlin中实现Builder模式的4种方法——从最简单到高级的DSL方法。



本文内容基于Stack Overflow上一个获得了数千次浏览的真实问题。我们将其改编为教育内容,以便您可以立即将知识应用于实践。



问题:什么时候需要Builder?



假设你有一个Pizza类:



class Pizza(    val size: String,    val cheese: Boolean = false,    val pepperoni: Boolean = false,    val mushrooms: Boolean = false,    val olives: Boolean = false,    val extraCheese: Boolean = false)


看起来还不错。但是当你创建一个包含5个可选参数的披萨时,代码变得难以阅读:



val pizza = Pizza("Large", true, false, true, false, true)


用眼睛去查找每个参数的含义非常痛苦。这时Builder模式就派上用场了。



方法1. 经典Java风格Builder(为了兼容性)



如果你需要支持Java代码,或者你想要一个尽可能明确的API,可以使用经典方法:



class Pizza private constructor(    val size: String,    val cheese: Boolean,    val pepperoni: Boolean,    val mushrooms: Boolean,    val olives: Boolean,    val extraCheese: Boolean) {    class Builder(private val size: String) {        private var cheese: Boolean = false        private var pepperoni: Boolean = false        private var mushrooms: Boolean = false        private var olives: Boolean = false        private var extraCheese: Boolean = false

fun cheese(value: Boolean) = apply { cheese = value } fun pepperoni(value: Boolean) = apply { pepperoni = value } fun mushrooms(value: Boolean) = apply { mushrooms = value } fun olives(value: Boolean) = apply { olives = value } fun extraCheese(value: Boolean) = apply { extraCheese = value }

fun build() = Pizza(size, cheese, pepperoni, mushrooms, olives, extraCheese) }}

// 使用方式:val pizza = Pizza.Builder("Large") .cheese(true) .pepperoni(true) .mushrooms(true) .build()


优点: 代码直观,Java开发者容易理解。
缺点: 大量样板代码,没有利用Kotlin的特性。



方法2. Kotlin风格:使用命名参数和默认值



最简单且通常是最好的方法是根本不使用Builder,而是依赖语言本身的特性:



data class Pizza(    val size: String,    val cheese: Boolean = false,    val pepperoni: Boolean = false,    val mushrooms: Boolean = false,    val olives: Boolean = false,    val extraCheese: Boolean = false)

// 使用方式:val pizza = Pizza( size = "Large", cheese = true, pepperoni = true, mushrooms = true)


这是干净、可读且类型安全的代码。Kotlin的命名参数解决了“魔法数字”和参数顺序的问题。



博客

书籍推荐