Как обеспечить, чтобы ненулевое значение было установлено равным изначально нулевому свойству при выполнении действия при установке значения? - PullRequest
0 голосов
/ 22 мая 2018

Предположим, что сначала существует свойство, которое имеет нулевое значение. Я хочу убедиться, что этому свойству будет задано только значение, не имеющее значения NULL.Кроме того, я хочу выполнять некоторые действия каждый раз после установки этого свойства.I. Я понял, что если я использую Delegates.observable, я должен внутренне проверить, что если значение равно нулю, прежде чем выполнять какое-либо действие, и что я не могу избежать того, что значение null установлено в значение (я могу наблюдать, только когда значение равноустановлено уже, не раньше) ii.Я не могу использовать lateinit, с тех пор я не могу наблюдать, когда устанавливается значение (синтаксис установщика не может работать с lateinit)

Я могу подумать о том, чтобы иметь настраиваемую функцию сеттера для этого значения и объявить параметркак не обнуляемый.Как показано ниже:

class Test {
    private var initialNull: String? = null

    private fun setInitial(nonNullValue: String) {
        initialNull = nonNullValue
        onInitialSet()
    }
}

Как вы думаете, это хорошая идея?

Я подумал о другой идее, что я мог бы создать пользовательский ReadWriteProperty, например NonNullableSetterObservable (initialValue), где null можетсначала будет передан initialValue, но позже может быть установлено только ненулевое значение.Это хорошая идея?

1 Ответ

0 голосов
/ 22 мая 2018

Как ни странно, звучит так, будто вам нужны некоторые функции всех трех делегатов стандартной библиотеки - observable, vetoable и notNull - в том же свойстве.

Написание собственного делегата для этого, как вы упомянули, действительно хорошая идея, вот одна реализация, основанная на ObservableProperty (если я правильно понял ваши требования):

public inline fun <T: Any> initialNull(crossinline onChange: (oldValue: T?, newValue: T) -> Unit): ObservableProperty<T?> {
    return object: ObservableProperty<T?>(null) {
        override fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
            value ?: return
            super.setValue(thisRef, property, value)
        }

        override fun afterChange(property: KProperty<*>, oldValue: T?, newValue: T?) {
            onChange(oldValue, newValue!!) // ugly but safe !!
        }
    }
}

Использование выглядит так:

var initialNull by initialNull<String> { oldValue, newValue ->
    println("Changed from $oldValue to $newValue")
}

initialNull = "Foo" // Changed from null to Foo
initialNull = null
initialNull = "Bar" // Changed from Foo to Bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...