@@ -33,19 +33,19 @@ class KMapper<T : Any> private constructor(
3333 .filter { it.kind != KParameter .Kind .INSTANCE && ! it.isUseDefaultArgument() }
3434 .associate { (parameterNameConverter(it.getAliasOrName()!! )) to ParameterForMap .newInstance(it) }
3535
36- private val getCache: ConcurrentMap <KClass <* >, List < ( Any , ArgumentBucket ) -> Unit >> = ConcurrentHashMap ()
36+ private val getCache: ConcurrentMap <KClass <* >, List <ArgumentBinder >> = ConcurrentHashMap ()
3737
3838 private fun bindArguments (argumentBucket : ArgumentBucket , src : Any ) {
3939 val clazz = src::class
4040
4141 // キャッシュヒットしたら登録した内容に沿って取得処理を行う
4242 getCache[clazz]?.let { getters ->
4343 // 取得対象フィールドは十分絞り込んでいると考えられるため、終了判定は行わない
44- getters.forEach { it(src, argumentBucket) }
44+ getters.forEach { it.bindArgument (src, argumentBucket) }
4545 return
4646 }
4747
48- val tempCacheArrayList = ArrayList < ( Any , ArgumentBucket ) -> Unit > ()
48+ val tempBinderArrayList = ArrayList <ArgumentBinder >()
4949
5050 src::class .memberProperties.forEach outer@{ property ->
5151 // propertyが公開されていない場合は処理を行わない
@@ -64,19 +64,14 @@ class KMapper<T : Any> private constructor(
6464 parameterMap[alias ? : property.name]?.let { param ->
6565 javaGetter.isAccessible = true
6666
67- val tempCache = { value: Any , bucket: ArgumentBucket ->
68- // 初期化済みであれば高コストな取得処理は行わない
69- if (! bucket.containsKey(param.param)) {
70- // javaGetterを呼び出す方が高速
71- bucket.putIfAbsent(param.param, javaGetter.invoke(value)?.let { param.mapObject(it) })
72- }
73- }
74- tempCache(src, argumentBucket)
75- tempCacheArrayList.add(tempCache)
67+ val binder = ArgumentBinder (param, javaGetter)
68+
69+ binder.bindArgument(src, argumentBucket)
70+ tempBinderArrayList.add(binder)
7671 // キャッシュの整合性を保つため、ここでは終了判定を行わない
7772 }
7873 }
79- getCache.putIfAbsent(clazz, tempCacheArrayList )
74+ getCache.putIfAbsent(clazz, tempBinderArrayList )
8075 }
8176
8277 private fun bindArguments (argumentBucket : ArgumentBucket , src : Map <* , * >) {
@@ -131,3 +126,13 @@ class KMapper<T : Any> private constructor(
131126 return function.call(bucket)
132127 }
133128}
129+
130+ private class ArgumentBinder (private val param : ParameterForMap <* >, private val javaGetter : Method ) {
131+ fun bindArgument (value : Any , bucket : ArgumentBucket ) {
132+ // 初期化済みであれば高コストな取得処理は行わない
133+ if (! bucket.containsKey(param.param)) {
134+ // javaGetterを呼び出す方が高速
135+ bucket.putIfAbsent(param.param, javaGetter.invoke(value)?.let { param.mapObject(it) })
136+ }
137+ }
138+ }
0 commit comments