update delegations

This commit is contained in:
tursom 2021-07-14 14:49:17 +08:00
parent 6f05cecb49
commit 6802e09f83
2 changed files with 17 additions and 13 deletions

View File

@ -4,7 +4,7 @@ import cn.tursom.core.uncheckedCast
import java.util.concurrent.TimeUnit
import kotlin.reflect.KProperty
class ExpirableMutableDelegatedField<in T, V : Any>(
class ExpirableMutableDelegatedField<in T, V>(
override val delegatedField: MutableDelegatedField<T, V>,
val expireMS: Long,
) : MutableDelegatedField<T, V?> by delegatedField.uncheckedCast(),
@ -23,24 +23,21 @@ class ExpirableMutableDelegatedField<in T, V : Any>(
override fun setValue(thisRef: T, property: KProperty<*>, value: V?) {
if (value != null) {
delegatedField.setValue(value)
delegatedField.setValue(thisRef, property, value)
setTime = System.currentTimeMillis()
}
}
override fun valueOnSet(thisRef: T, property: KProperty<*>, value: V?, oldValue: V?) {
if (value != null) {
setTime = System.currentTimeMillis()
}
}
}
fun <T, V : Any> MutableDelegatedField<T, V>.expirable(
fun <T, V> MutableDelegatedField<T, V>.expirable(
expireTime: Long,
timeUnit: TimeUnit = TimeUnit.MILLISECONDS,
): MutableDelegatedField<T, V?> {
return ExpirableMutableDelegatedField(this, timeUnit.toMillis(expireTime))
}
@JvmName("expirableTV?")
fun <T, V : Any> MutableDelegatedField<T, V?>.expirable(
expireTime: Long,
timeUnit: TimeUnit = TimeUnit.MILLISECONDS,
): MutableDelegatedField<T, V?> {
return ExpirableMutableDelegatedField(uncheckedCast(), timeUnit.toMillis(expireTime))
}

View File

@ -1,5 +1,6 @@
package cn.tursom.core.delegation
import cn.tursom.core.final
import cn.tursom.core.getFieldForAll
import cn.tursom.core.uncheckedCast
import java.lang.reflect.Field
@ -10,6 +11,7 @@ class ReflectionDelegatedField<in T, V>(
) : MutableDelegatedField<T, V> {
init {
field.isAccessible = true
field.final = false
}
override fun getValue(): V = field.get(receiver).uncheckedCast()
@ -18,6 +20,10 @@ class ReflectionDelegatedField<in T, V>(
field.set(receiver, value)
}
override fun toString(): String {
return "ReflectionDelegatedField(receiver=$receiver, field=$field)"
}
companion object {
fun <T : Any, V> T.superField(
fieldName: String,
@ -31,6 +37,7 @@ class ReflectionDelegatedField<in T, V>(
return ReflectionDelegatedField(this, field)
}
@Suppress("UNUSED_PARAMETER")
fun <T, V> T.field(
field: Field,
type: V,
@ -38,6 +45,7 @@ class ReflectionDelegatedField<in T, V>(
return ReflectionDelegatedField(this, field)
}
@Suppress("UNUSED_PARAMETER")
inline fun <T, V> T.field(
field: Field,
type: () -> V,
@ -46,4 +54,3 @@ class ReflectionDelegatedField<in T, V>(
}
}
}