面试题答案
一键面试实现思路
- 缓存设计:使用一个合适的数据结构(如
ConcurrentHashMap
)来存储已经构建好的对象。键可以是构建对象所需参数的某种唯一标识,值则是对应的构建好的对象实例。 - 链式调用与类型安全:保持构建器的现有链式调用和类型安全实现不变,在构建方法中加入缓存检查逻辑。
- 多线程安全:利用
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,表明是同一个实例
}