@@ -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