MST

星途 面试题库

面试题:Kotlin类型安全构建器模式的优化与扩展

在现有Kotlin类型安全构建器模式实现的基础上,假设业务需求变更,需要支持构建器的缓存机制(即如果构建相同参数的对象,直接返回缓存中的实例而不是重新构建),并且要兼容构建器的链式调用和类型安全特性,同时考虑多线程环境下的安全性。请描述实现思路并给出关键代码片段。
23.1万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 缓存设计:使用一个合适的数据结构(如ConcurrentHashMap)来存储已经构建好的对象。键可以是构建对象所需参数的某种唯一标识,值则是对应的构建好的对象实例。
  2. 链式调用与类型安全:保持构建器的现有链式调用和类型安全实现不变,在构建方法中加入缓存检查逻辑。
  3. 多线程安全:利用ConcurrentHashMap本身在多线程环境下的线程安全性。如果构建过程中有其他可能涉及多线程问题的部分(如构建复杂对象时的内部状态变化),可以使用synchronized关键字或java.util.concurrent包下的其他工具来确保线程安全。

关键代码片段

import java.util.concurrent.ConcurrentHashMap

class MyObject {
    // MyObject的属性和方法
}

class MyObjectBuilder {
    // 构建MyObject所需的参数
    private var param1: String? = null
    private var param2: Int? = null

    fun setParam1(param1: String): MyObjectBuilder {
        this.param1 = param1
        return this
    }

    fun setParam2(param2: Int): MyObjectBuilder {
        this.param2 = param2
        return this
    }

    private companion object {
        private val cache = ConcurrentHashMap<String, MyObject>()
        private fun generateCacheKey(param1: String?, param2: Int?): String {
            return "$param1-$param2"
        }
    }

    fun build(): MyObject {
        val key = generateCacheKey(param1, param2)
        return cache.getOrPut(key) {
            // 如果缓存中没有,则构建新的MyObject
            MyObject().also {
                // 根据参数设置MyObject的属性
                param1?.let { it1 -> /* 设置MyObject的对应属性 */ }
                param2?.let { it2 -> /* 设置MyObject的对应属性 */ }
            }
        }
    }
}

使用示例:

fun main() {
    val obj1 = MyObjectBuilder()
      .setParam1("value1")
      .setParam2(1)
      .build()
    val obj2 = MyObjectBuilder()
      .setParam1("value1")
      .setParam2(1)
      .build()
    println(obj1 === obj2) // 输出true,表明是同一个实例
}