Rob Elliot
03/21/2024, 4:48 PMRob Elliot
03/21/2024, 4:49 PMFeatureFlag
constructor is private:
class FeatureFlags(
private val featureFlagsClient: FeatureFlagsClient,
) {
val myNewFeature = FeatureFlag(key = "my-new-feature", defaultValue = false)
inner class FeatureFlag private constructor(val key: String, val defaultValue: Boolean) {
fun isEnabled(): Boolean = featureFlagsClient.isEnabled(this)
}
}
interface FeatureFlagsClient {
fun isEnabled(flag: FeatureFlags.FeatureFlag): Boolean
}
Rob Elliot
03/21/2024, 4:50 PMinternal
then it is possible to construct a FeatureFlag
from outside the body of `FeatureFlags`:
FeatureFlags(featureFlagsClient).FeatureFlag("escaped-feature-flag", true)
Rob Elliot
03/21/2024, 4:52 PMRob Elliot
03/21/2024, 5:03 PMRob Elliot
03/21/2024, 5:03 PMpackage mocklab.system.featureflags
interface FeatureFlag {
fun isEnabled(): Boolean
}
class FeatureFlags(
private val featureFlagsClient: FeatureFlagsClient,
) {
val myNewFeature: FeatureFlag = ClientBackedFeatureFlag(key = "my-new-feature", defaultValue = false)
private inner class ClientBackedFeatureFlag(
override val key: String,
override val defaultValue: Boolean,
) : FeatureFlag, FeatureFlagDefinition {
override fun isEnabled(): Boolean = featureFlagsClient.isEnabled(this)
}
}
interface FeatureFlagDefinition {
val key: String
val defaultValue: Boolean
}
interface FeatureFlagsClient {
fun isEnabled(flag: FeatureFlagDefinition): Boolean
}
Sam
03/21/2024, 5:06 PMinterface FeatureFlagsClient {
fun isEnabled(key: String): Boolean?
}
it'll be much easier to test 😄Sam
03/21/2024, 5:07 PMSam
03/21/2024, 5:07 PMRob Elliot
03/21/2024, 5:08 PMFeatureFlagDefinition
interface to get round that - I don't think there's a circular dep any moreSam
03/21/2024, 5:08 PMRob Elliot
03/21/2024, 5:08 PMSam
03/21/2024, 5:08 PMSam
03/21/2024, 5:08 PMRob Elliot
03/21/2024, 5:10 PM