Ognyan
Ognyan

Reputation: 13600

How to have custom setter with check of the parameter for validity?

I am new to Kotlin and I can't wrap my head around a extremely basic problem:

I want to have a custom setter and to check if the parameter value is valid (and throw exception if not).

My code:

class Test {
    var presni: Int = 1
        set(value) {
            if (value < 0) {
                throw IllegalArgumentException("Negative value");
            }

            presni = value
        }
}

but it gives me warning at the presni = value line: Recursive property accessor

What is the idiom in Kotlin for checking the parameter in a setter for validity?

Upvotes: 2

Views: 1468

Answers (2)

Fredy Mederos
Fredy Mederos

Reputation: 2636

To validate a value before saving it in the backing field you can also use the Vetoable Delegate.

This is an example:

var presni: Int by Delegates.vetoable(1,{ _, _, newValue ->
        newValue >= 0
    })

The official documentation says:

If the callback returns true the value of the property is being set to the new value, and if the callback returns false the new value is discarded and the property remains its old value.

Upvotes: 7

Giorgio Antonioli
Giorgio Antonioli

Reputation: 16214

You have to use the automatic backing field provided by Kotlin. You can access to it using the field identifier.

class Test {
    var presni: Int = 1
        set(value) {
            if (value < 0) {
                throw IllegalArgumentException("Negative value");
            }

            // Assign the value to the backing field.
            field = value
        }
}

Upvotes: 7

Related Questions