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

Commit 47c263e

Browse files
committed
パラメータ取得処理をラムダではなく個々の型で管理するように変更
1 parent 6f67bfe commit 47c263e

File tree

1 file changed

+29
-9
lines changed

1 file changed

+29
-9
lines changed

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

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,33 +15,33 @@ internal class ParameterForMap<T : Any> private constructor(val param: KParamete
1515
// リストの長さが小さいと期待されるためこの形で実装しているが、理想的にはmap的なものが使いたい
1616
private val converters: Set<Pair<KClass<*>, KFunction<T>>> = clazz.getConverters()
1717

18-
private val convertCache: ConcurrentMap<KClass<*>, (Any) -> Any?> = ConcurrentHashMap()
18+
private val convertCache: ConcurrentMap<KClass<*>, ParameterProcessor> = ConcurrentHashMap()
1919

2020
fun <U : Any> mapObject(value: U): Any? {
2121
val valueClazz: KClass<*> = value::class
2222

2323
// 取得方法のキャッシュが有ればそれを用いる
24-
convertCache[valueClazz]?.let { return it(value) }
24+
convertCache[valueClazz]?.let { return it.process(value) }
2525

2626
// パラメータに対してvalueが代入可能(同じもしくは親クラス)であればそのまま用いる
2727
if (clazz.isSuperclassOf(valueClazz)) {
28-
convertCache.putIfAbsent(valueClazz) { it }
28+
convertCache.putIfAbsent(valueClazz, ParameterProcessor.Plain)
2929
return value
3030
}
3131

3232
val converter: KFunction<*>? = converters.getConverter(valueClazz)
3333

34-
val lambda: (Any) -> Any? = when {
34+
val processor: ParameterProcessor = when {
3535
// converterに一致する組み合わせが有れば設定されていればそれを使う
36-
converter != null -> { { converter.call(it) } }
36+
converter != null -> ParameterProcessor.UseConverter(converter)
3737
// 要求された値がenumかつ元が文字列ならenum mapperでマップ
38-
javaClazz.isEnum && value is String -> { { EnumMapper.getEnum(javaClazz, it as String) } }
38+
javaClazz.isEnum && value is String -> ParameterProcessor.ToEnum(javaClazz)
3939
// 要求されているパラメータがStringならtoStringする
40-
clazz == String::class -> { { it.toString() } }
40+
clazz == String::class -> ParameterProcessor.ToString
4141
else -> throw IllegalArgumentException("Can not convert $valueClazz to $clazz")
4242
}
43-
convertCache.putIfAbsent(valueClazz, lambda)
44-
return lambda(value)
43+
convertCache.putIfAbsent(valueClazz, processor)
44+
return processor.process(value)
4545
}
4646

4747
companion object {
@@ -50,3 +50,23 @@ internal class ParameterForMap<T : Any> private constructor(val param: KParamete
5050
}
5151
}
5252
}
53+
54+
private sealed class ParameterProcessor {
55+
abstract fun process(value: Any): Any?
56+
57+
object Plain : ParameterProcessor() {
58+
override fun process(value: Any): Any? = value
59+
}
60+
61+
class UseConverter(private val converter: KFunction<*>) : ParameterProcessor() {
62+
override fun process(value: Any): Any? = converter.call(value)
63+
}
64+
65+
class ToEnum(private val javaClazz: Class<*>) : ParameterProcessor() {
66+
override fun process(value: Any): Any? = EnumMapper.getEnum(javaClazz, value as String)
67+
}
68+
69+
object ToString : ParameterProcessor() {
70+
override fun process(value: Any): Any? = value.toString()
71+
}
72+
}

0 commit comments

Comments
 (0)