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

Commit 81f2e74

Browse files
committed
ラムダではなく型で取得方法を指定するように変更
1 parent 4ad7339 commit 81f2e74

File tree

1 file changed

+52
-43
lines changed

1 file changed

+52
-43
lines changed

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

Lines changed: 52 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -19,55 +19,64 @@ import kotlin.reflect.full.staticFunctions
1919
import kotlin.reflect.jvm.isAccessible
2020
import kotlin.reflect.jvm.jvmName
2121

22-
internal class ParameterForMap private constructor(
23-
val param: KParameter,
24-
name: String,
25-
parameterKClazz: KClass<*>
26-
) {
27-
private val objectGetter: (ResultSet) -> Any?
28-
29-
init {
30-
val deserializerFromParameter = param.getDeserializer()
31-
if (deserializerFromParameter != null) {
32-
val deserialize = deserializerFromParameter::deserialize
33-
34-
objectGetter = {
35-
deserialize.call(it.getObject(name, deserializerFromParameter.srcClass))
36-
}
37-
} else {
38-
val deserializer = parameterKClazz.getDeserializer()
39-
40-
if (deserializer != null) {
41-
val targetClass = deserializer.parameters.single().type.classifier as KClass<*>
22+
internal sealed class ParameterForMap {
23+
abstract val param: KParameter
24+
abstract val name: String
25+
abstract val clazz: Class<*>
26+
abstract fun getObject(rs: ResultSet): Any?
27+
28+
private class Plain(
29+
override val param: KParameter,
30+
override val name: String,
31+
override val clazz: Class<*>
32+
) : ParameterForMap() {
33+
override fun getObject(rs: ResultSet): Any? = rs.getObject(name, clazz)
34+
}
4235

43-
objectGetter = {
44-
deserializer.call(it.getObject(name, targetClass.javaObjectType))
45-
}
46-
} else {
47-
val clazz = parameterKClazz.javaObjectType
48-
49-
objectGetter = if (clazz.isEnum) {
50-
{
51-
EnumMapper.getEnum(clazz, it.getString(name))
52-
}
53-
} else {
54-
{
55-
it.getObject(name, clazz)
56-
}
57-
}
58-
}
59-
}
36+
private class Enum(
37+
override val param: KParameter,
38+
override val name: String,
39+
override val clazz: Class<*>
40+
) : ParameterForMap() {
41+
override fun getObject(rs: ResultSet): Any? = EnumMapper.getEnum(clazz, rs.getString(name))
6042
}
6143

62-
fun getObject(rs: ResultSet): Any? = objectGetter(rs)
44+
private class Deserializer(
45+
override val param: KParameter,
46+
override val name: String,
47+
override val clazz: Class<*>,
48+
private val deserializer: KFunction<*>
49+
) : ParameterForMap() {
50+
constructor(
51+
param: KParameter,
52+
name: String,
53+
deserializer: AbstractKColumnDeserializer<*, *, *>
54+
) : this(param, name, deserializer.srcClass, deserializer::deserialize)
55+
56+
override fun getObject(rs: ResultSet): Any? = deserializer.call(rs.getObject(name, clazz))
57+
}
6358

6459
companion object {
6560
fun newInstance(param: KParameter, parameterNameConverter: (String) -> String): ParameterForMap {
66-
return ParameterForMap(
67-
param,
68-
parameterNameConverter(param.getAliasOrName()!!),
69-
param.type.classifier as KClass<*>
70-
)
61+
val name = parameterNameConverter(param.getAliasOrName()!!)
62+
63+
param.getDeserializer()?.let {
64+
return Deserializer(param, name, it)
65+
}
66+
67+
val parameterKClazz = param.type.classifier as KClass<*>
68+
69+
parameterKClazz.getDeserializer()?.let {
70+
val targetClass = (it.parameters.single().type.classifier as KClass<*>).javaObjectType
71+
return Deserializer(param, name, targetClass, it)
72+
}
73+
74+
return parameterKClazz.javaObjectType.let {
75+
when (it.isEnum) {
76+
true -> Enum(param, name, it)
77+
false -> Plain(param, name, it)
78+
}
79+
}
7180
}
7281
}
7382
}

0 commit comments

Comments
 (0)