Search code examples
kotlinconstructorpropertiesprimary-constructor

Init a property with a setter in a primary constructor in Kotlin


I have the following code:

class Camera : AsyncActiveInputDevice<Image> {
    constructor(inputListener: ((Image) -> Unit)? = null) {
        this.inputListener = inputListener
    }

    override var inputListener: ((Image) -> Unit)?
        set(value) {
            field = value
            TODO("call C/Python implementation")
        }
}

And IntelliJ IDEA is suggesting converting the constructor to a primary constructor.

So how to convert this? How to init a property with a setter in a primary constructor? I have tried init blocks but it then shows an error: "Variable can not be initialized before declaration".


Solution

  • Such a primary constructor would go in the header of the class, like this:

    class Camera(inputListener: ((Image) -> Unit)? = null) : AsyncActiveInputDevice<Image> {
    
        override var inputListener: ((Image) -> Unit)? = inputListener
            set(value) {
                field = value
                TODO("call C/Python implementation")
            }
    
    }
    

    You can get this conversion done by the IDE by invoking intention actions on the warning (Alt + Enter on Windows, ⌥↩ on macOS), and choosing Convert to primary constructor.