ScarySneer
ScarySneer

Reputation: 319

How to access class constructor parameters in a companion object

I would like to access the arguments passed to the class constructor in a companion object :

class Home(private val activity: String) {
    companion object {
        fun doSomething() {
            println(activity)
        }
    }
}

fun main() {
    Home("Hello World").doSomething()

However, an error is raised when I run this code saying that activity is unresolved reference

Upvotes: 4

Views: 4639

Answers (1)

user2340612
user2340612

Reputation: 10713

A companion object is basically the equivalent of a Java static nested class (and that's how it's implemented under the hood), which means an instance of the static nested class could exist even with no instance of the outer class. Example:

class Outer(private val activity: String) {
    companion object {
        fun doSomething() {
            println("Hello, world!")
        }
    }
}

fun main() {
    Outer.doSomething() // no new Outer instance here
}

If you want a non-static nested class (aka inner class) you can then reference properties of the outer class from within the inner class. That's because instances of the inner class are tied to instances of the outer class. Example:

class Outer(private val activity: String) {
    inner class Inner {
        fun doSomething() {
            println(activity)
        }
    }
}

fun main() {
    Outer("Hello, world!").Inner().doSomething()
}

For more info, you can also have a look at Java documentation about nested (aka static) and inner (aka non-static) classes here: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Upvotes: 3

Related Questions