diff --git a/build.gradle.kts b/build.gradle.kts index cee5e1d..224c400 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } group = "com.mapk" -version = "0.14" +version = "0.15" java { sourceCompatibility = JavaVersion.VERSION_1_8 diff --git a/src/main/kotlin/com/mapk/core/internal/ArgumentBinder.kt b/src/main/kotlin/com/mapk/core/internal/ArgumentBinder.kt index d10729d..c80e746 100644 --- a/src/main/kotlin/com/mapk/core/internal/ArgumentBinder.kt +++ b/src/main/kotlin/com/mapk/core/internal/ArgumentBinder.kt @@ -24,8 +24,9 @@ internal sealed class ArgumentBinder(val annotations: List) { override val requiredClazz: KClass ) : ArgumentBinder(annotations), ValueParameter { override fun bindArgument(adaptor: ArgumentAdaptor, valueArray: Array): Boolean { - return if (adaptor.isInitialized(name)) { - valueArray[index] = adaptor.readout(name) + val value = adaptor.readout(name) + return if (value != null || adaptor.isInitialized(name)) { + valueArray[index] = value true } else { false @@ -43,7 +44,7 @@ internal sealed class ArgumentBinder(val annotations: List) { override fun bindArgument(adaptor: ArgumentAdaptor, valueArray: Array): Boolean { val temp = function.call(adaptor) - if (!isNullable && temp == null) return false + if (temp == null && !isNullable) return false valueArray[index] = temp return true diff --git a/src/main/kotlin/com/mapk/core/internal/ArgumentBucket.kt b/src/main/kotlin/com/mapk/core/internal/ArgumentBucket.kt index fa7d1b1..3ae837c 100644 --- a/src/main/kotlin/com/mapk/core/internal/ArgumentBucket.kt +++ b/src/main/kotlin/com/mapk/core/internal/ArgumentBucket.kt @@ -4,7 +4,6 @@ import com.mapk.core.ArgumentAdaptor import java.util.Objects import kotlin.reflect.KParameter -// TODO: 初期化の効率化方法の検討他 internal class ArgumentBucket( private val keyList: List, val valueArray: Array, @@ -17,35 +16,42 @@ internal class ArgumentBucket( override var value: Any? ) : Map.Entry - private val initializationStatusManager = InitializationStatusManager(initializationStatus) + private val initializationStatuses: List val isInitialized: Boolean override val size: Int init { + var count: Int = if (initializationStatus[0]) 1 else 0 + argumentBinders.forEach { val result = it.bindArgument(adaptor, valueArray) - if (result) initializationStatusManager.put(it.index) + if (result) { + count++ + initializationStatus[it.index] = true + } } - isInitialized = initializationStatusManager.isFullInitialized - size = initializationStatusManager.count + initializationStatuses = initializationStatus.toList() + isInitialized = count == initializationStatus.size + size = count } - override fun containsKey(key: KParameter): Boolean = initializationStatusManager.isInitialized(key.index) + override fun containsKey(key: KParameter): Boolean = initializationStatuses[key.index] override fun containsValue(value: Any?): Boolean = valueArray.any { Objects.equals(value, it) } override fun get(key: KParameter): Any? = valueArray[key.index] - override fun isEmpty(): Boolean = initializationStatusManager.count == 0 + override fun isEmpty(): Boolean = size == 0 + // NOTE: 本来であれば生成時に確定する内容だが、これらのメソッドは関数呼び出し時にアクセスされることが無いため、カスタムゲッターとしている override val entries: Set> get() = keyList - .filter { initializationStatusManager.isInitialized(it.index) } + .filter { initializationStatuses[it.index] } .map { Entry(it, valueArray[it.index]) } .toSet() override val keys: Set - get() = keyList.filter { initializationStatusManager.isInitialized(it.index) }.toSet() + get() = keyList.filter { initializationStatuses[it.index] }.toSet() override val values: Collection - get() = valueArray.filterIndexed { i, _ -> initializationStatusManager.isInitialized(i) } + get() = valueArray.filterIndexed { i, _ -> initializationStatuses[i] } } diff --git a/src/main/kotlin/com/mapk/core/internal/InitializationStatusManager.kt b/src/main/kotlin/com/mapk/core/internal/InitializationStatusManager.kt deleted file mode 100644 index 73b773e..0000000 --- a/src/main/kotlin/com/mapk/core/internal/InitializationStatusManager.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.mapk.core.internal - -internal class InitializationStatusManager(private val initializationStatus: Array) { - private val size = initializationStatus.size - val isFullInitialized: Boolean get() = count == size - var count: Int = if (initializationStatus[0]) 1 else 0 - - fun isInitialized(index: Int): Boolean = initializationStatus[index] - - fun put(index: Int) { - initializationStatus[index] = true - count++ - } -}