Home > Software engineering >  How do I create an instance of a Class passed as parameter to a function?
How do I create an instance of a Class passed as parameter to a function?

Time:02-07

I'm building a library in Kotlin and here's my usecase

I have a base class

abstract class Component(...) {
  // ... class body
}

I want the users of my library to define their own sub-classes like say:

class MyComponent() : Component() {
  // .. class body
}

How can I write a helper function that takes in this derived class as a param and create an instance out of it. Something like:

fun helper(component: Class, props: HashMap<String, String>) : Component {
  // somehow create a new instance of Class and return it?
}

Thanks!

CodePudding user response:

You can have users pass a constructor reference:


fun helper(componentConstructor: ()->Component, props: Map<String, String>) : Component {
  val component = componentConstructor()
    // set it up and return it. 
}

// usage:
val component = helper(::MyComponent, emptyMap())

Better for props not to require a specific type of map since it doesn’t matter here. Needless burden for users of your library.

CodePudding user response:

abstract class Component(val prop1: String, val prop2: String) {
  // ... class body
}

class MyComponent(prop1: String, prop2: String) : Component (prop1, prop2) {
  // ... class body
}

fun helper(component: Class<MyComponent>, props: Map<String, String>): Component {
  val constructor = component.constructors.first { it.parameterCount == props.size }
  val arguments = props.values.toTypedArray()
  return constructor.newInstance(*arguments) as Component
}

val instance = helper(MyComponent::class.java, mapOf("prop1" to "value1", "prop2" to "value2"))

println(instance.prop1   ", "   instance.prop2)   // Prints:   value1, value2
  •  Tags:  
  • Related