Skip to content
This repository was archived by the owner on Jan 20, 2023. It is now read-only.

Commit 2345dbb

Browse files
committed
バインド処理をクラスとして切り出し
1 parent 47c263e commit 2345dbb

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

src/main/kotlin/com/mapk/kmapper/KMapper.kt

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)