当前位置: 首页 > 知识库问答 >
问题:

如何在Kotlin中实现Builder模式?

毕胡非
2023-03-14

嗨,我是Kotlin世界的新手。我喜欢到目前为止所看到的,并开始考虑将我们在应用程序中使用的一些库从Java转换为Kotlin。

第二次更新:问题是如何用Kotlin中的一些参数为一个简单的pojo编写一个构建器设计模式?下面的代码是我的尝试,方法是编写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
        }
    }
}

共有1个答案

闾丘照
2023-03-14

首先,在大多数情况下,您不需要使用Kotlin中的构建器,因为我们有默认和命名参数。这使您能够编写

class Car(val model: String? = null, val year: Int = 0)

并按如下方式使用:

val car = Car(model = "X")

如果您绝对想要使用构建器,下面是您可以使用的方法:

class Car( //add private constructor if necessary
        val model: String?,
        val year: Int
) {

    private constructor(builder: Builder) : this(builder.model, builder.year)

    class Builder {
        var model: String? = null
            private set

        var year: Int = 0
            private set

        fun model(model: String) = apply { this.model = model }

        fun year(year: Int) = apply { this.year = year }

        fun build() = Car(this)
    }
}
class Car (
        val model: String?,
        val year: Int
) {

    private constructor(builder: Builder) : this(builder.model, builder.year)

    companion object {
        inline fun build(block: Builder.() -> Unit) = Builder().apply(block).build()
    }

    class Builder {
        var model: String? = null
        var year: Int = 0

        fun build() = Car(this)
    }
}

如果某些值是必需的,并且没有默认值,则需要将它们放在构建器的构造函数中,还需要放在我们刚刚定义的build方法中:

class Car (
        val model: String?,
        val year: Int,
        val required: String
) {

    private constructor(builder: Builder) : this(builder.model, builder.year, builder.required)

    companion object {
        inline fun build(required: String, block: Builder.() -> Unit) = Builder(required).apply(block).build()
    }

    class Builder(
            val required: String
    ) {
        var model: String? = null
        var year: Int = 0

        fun build() = Car(this)
    }
}

用法:val car=car.build(required=“requiredValue”){model=“x”}

 类似资料:
  • 考虑一下问题: 我们有一个带有抽象方法的类。现在,我们希望强制此方法的每个覆盖都将执行一些参数检查或其他一些苦差事。我们希望此参数检查在所有覆盖中都相同。一种解决方案是将此行为包装在一个调用抽象方法的非抽象方法中: 我想让私有,这样的任何子类都不能在不检查其参数的情况下偶然调用它。不幸的是,这是不可能的: 错误:(9,5)Kotlin:修饰符“private”与“abstract”不兼容 Kotl

  • 今天,我在kotlin中实现了一个,正如我过去在java中所做的那样,我希望实现一个,作为最后的后退,以防客户机代码忘记关闭它,从而使关键资源无法回收。我认为此资源足够重要,可以添加此回退,尽管此回退不可靠。但是,没有声明方法,这意味着我不能简单地做到这一点: 但是这种变通方法需要一个超类。如果下次我的其他已经获得了一个超类,那么如果没有大量的样板文件,这个变通方法将无法工作。

  • 我的Kotlin项目需要一个Java注释。 不幸的是,这似乎很困难。我在这里找到了这种讨论: https://discuss.kotlinlang.org/t/intdef-and-stringdef-not-being-checked-at-compile-time/7029/3 我明白这可能是一个Lint问题。不执行编译时检查。两人都没有提出任何建议。我可以添加任何字符串作为参数。 我最终用我

  • 有可能写这样的东西吗,或者我们必须回到Kotlin中的手动空检查?

  • 本文向大家介绍java实现建造者模式(Builder Pattern),包括了java实现建造者模式(Builder Pattern)的使用技巧和注意事项,需要的朋友参考一下 一、什么是建筑者模式?   建造者模式(Builder Pattern)使用多个简单的对象一步一步构建一个复杂的对象。   一个 Builder 类会一步一步构造最终的对象,该 Builder 类独立于其他对象。   建造者

  • 我有扩展抽象类的类,我不想把放在所有子类的顶部。 有没有办法为抽象类实现Lombok?