I am new to kotlin and I want to make an abstract/open class or interface, something that can be implemented by other classes. Let's call it Test
. Now Test
needs to have a HashSet (the docs say it requires less memory than a normal set) that every derived class will implement and fill with its own values.
interface Test {
val players: HashSet<String>
}
class Supa: Test {
override val players = hashSetOf<String>()
fun later() {
players.add("new player")
}
}
fun main() {
Supa().later()
println(Supa().players)
}
The above will output []
. It seems that for some reason players
doesn't get updated. After playing around in the kotlin playground I found out that if I print players
from inside later()
it will show the added element. Maybe it creates a new instance of player that exists in the scope of the function?? Could someone please show me how I can make an abstract hashSet that the derived class can override and fill with values that stay in the set?
The problem here is that you create two separate instances of Supa
. You invoke later()
on one of them and then print players
of another one. Each Supa()
creates a new instance.
You need to store Supa
instance inside a variable and use it in both places:
val supa = Supa()
supa.later()
println(supa.players)
This isn't really specific to Kotlin. Your code would work the same in other languages as well.