Not like in Swift, because:
Extensions are resolved statically.
Extensions do not actually modify classes they extend. By defining an
extension, you do not insert new members into a class, but merely make
new functions callable with the dot-notation on variables of this
type. (Source)
If a companion object is defined in your target class, go with s1m0nw1's approach. The advantage is that you can call the extension function without an instance (statically) of the target class.
If not, use a classic Factory Pattern:
class Fruit(var name: String = "") {
}
class FruitFactory {
companion object {
fun create(name: String): Fruit {
return Fruit().apply {
this.name = "Tasty $name"
}
}
}
}
fun main(args: Array<String>) {
val orange = Fruit("Orange")
println(orange.name)
val apple = FruitFactory.create("Apple")
println(apple.name)
}
You can extend the Factory as you wish with further constructors either nested or as extension functions.
Output:
Orange
Tasty Apple