是否有可能在Kotlin中创建扩展构造函数?

在Swift等其他语言中,可以创建一个添加新构造函数的函数扩展。

像这样的东西:

// base class class Whatever() { ... } // constructor method extension fun Whatever.constructor(potato: String) { setPotato(potato) } fun main(args: Array<String>) { println(Whatever("holi")) } 

在Kotlin有没有办法做到这一点?

不像在Swift中,因为:

扩展名是静态解析的。 扩展实际上并不修改它们扩展的类。 通过定义扩展,不要将新成员插入到类中,而只需使用这种类型的变量的点符号来调用新函数。 ( 来源 )


如果在你的目标类中定义一个伴随对象 ,那么用s1m0nw1的方法 。 优点是你可以调用扩展函数而不需要目标类的实例(静态的)。


如果没有 ,请使用经典工厂模式:

 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) } 

您可以使用进一步的构造函数嵌套或作为扩展函数来随意扩展Factory。

输出:

橙子
美味的苹果

似乎没有官方的“构造函数的函数扩展”,但是你可以创建一个模仿构造函数的包装方法

 class Foo() { ... } fun Foo(stuff: Int): Foo = Foo().apply {setStuff(stuff)} fun main(args: Array<String>){ println(Foo(123)) } 

你不能这样做。 你可以做什么:用工厂方法扩展一个类的companion对象:

 // base class class Whatever() { companion object { } } // factory extension fun Whatever.Companion.withPotato(potato: String) { //setPotato(potato) } fun main(args: Array<String>) { println(Whatever.withPotato("holi")) } 

唯一的问题: companion对象必须存在才能做到这一点。