Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kotlin getter / setter when using a primary constructor

Tags:

kotlin

The example is from a Kotlin-course I'm doing:

class Car {
    var speed: Int = 0
        get() = field 
        set(value) {
            field = value
        }
}

If I like to use a primary constructor like this:

class Car(var speed: Int)

How would I have to write the getter / setter in that case?

like image 606
cluster1 Avatar asked Jun 12 '20 06:06

cluster1


3 Answers

You cannot write getters/setters inside of the constructor, you can do the following:

  1. Create variable inside class whose value taken from constructor.
class Car(speed: Int) {
    var speed = speed
        get() = field 
        set(value) {
            field = value
        }
}
  1. Use @JvmField annotation to restrict compiler not to auto-generate getters/setters and implement one yourself
class Car(@JvmField private var speed: Int) {
    fun getSpeed() = speed
    fun setSpeed(value: Int) { speed = value }
}
like image 132
Animesh Sahu Avatar answered Oct 23 '22 11:10

Animesh Sahu


You can just initialize your property with the value from constructor:

class Car(speed: Int) {
    var speed: Int = speed
        get() = field
        set(value) {
            field = value
        }
}
like image 29
Andrei Tanana Avatar answered Oct 23 '22 13:10

Andrei Tanana


Syntax of property –

var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]

Here, property initializer, getter and setter are optional. We can also omit property type if it can be inferred from the initializer. The syntax of a read-only or immutable property declaration differs from a mutable one in two ways: starts with val instead of var, and does not allow a setter.

In kotlin, val is used as only for read means getter and var is used as for not getter() and setter()

class Company {
var name: String = "Defaultvalue"
}

The above code is equivalent to the below code

class Company {
    var name: String = "defaultvalue"
        get() = field                     // getter
        set(value) { field = value }      // setter
}

You can also use kotlin data class if you want to hold data in your Car class. so you no need to define getter and setter.

data class Car(var speed: Int)

For more check https://kotlinlang.org/docs/reference/properties.html#getters-and-setters

like image 1
Krishna Sony Avatar answered Oct 23 '22 12:10

Krishna Sony