0

I have a sealed class that has different subtypes extending from it. When I try to use a when clause to filter out a subtype I keep getting unresolved reference "name"

sealed class Fruit(val name: String) {
    object APPLE : Fruit(“apple”)

    data class BANANA(val isFruit: Boolean) : Fruit(“banana”)
}


internal object Random {
   fun build(name: String): FruitNinja{
     when(name) {
       Fruit.APPLE.name -> {
        
         return AppleFruitNinja()
       }
       // keep getting error here Unresolved reference: name
       Fruit.BANANA.name-> {
         return BananaFruitNinja()
       }
     }
    }
   }

How can I use the "name" argument to filter in the when clause and build custom objects .

luckysing_noobster
  • 1,933
  • 5
  • 24
  • 50

2 Answers2

2

You cannot access member variables using class name, because Apple is object, you can directly access name using . operator but as BANANA is a class, you need to create instance before accessing name as in

internal object Random {
    fun build(name: String): FruitNinja{
        when(name) {
            Fruit.APPLE.name -> {

                return AppleFruitNinja()
            }
            Fruit.BANANA(true).name -> {
                return BananaFruitNinja()
            }
        }
    }
}
Rajan Kali
  • 12,627
  • 3
  • 25
  • 37
2

As correctly explained by @rajan.kali APPLE is an object and therefore you can access name directly. However, BANANA is a class so you need to create an instance of that class or I would suggest creating a companion object:

sealed class Fruit(val name: String) {
    object APPLE : Fruit("apple")

    data class BANANA(val isFruit: Boolean) : Fruit(name) {
        companion object { 
            const val name = "banana" 
        }
    }
}

and then you can use it in the same way as APPLE:

internal object Random {
    fun build(name: String): FruitNinja {
        when (name) {
            Fruit.APPLE.name -> {
                return AppleFruitNinja()
            }
            Fruit.BANANA.name -> {
                return BananaFruitNinja()
            }
        }
    }
}

As a last point, the build method could be written in a more kotliny fashion:

internal object Random {
    fun build(name: String): FruitNinja = when (name) {
        Fruit.APPLE.name -> AppleFruitNinja()
        Fruit.BANANA.name -> BananaFruitNinja()
        else -> TODO()
    }
}
Feedbacker
  • 890
  • 6
  • 17