は、スウィフトに好きないコンストラクタを模倣したパッケージ・メソッドを作成することができますので:
拡張機能静的に解決されます。 エクステンションは実際に拡張するクラスを変更しません。 拡張を定義すると、新しいメンバーをクラスに挿入するのではなく、 型の変数のドット表記で新しい関数を呼び出し可能にするだけです。 (Source)
コンパニオンオブジェクトは、ターゲット・クラスでが定義されている場合、s1m0nw1's approachで行きます。利点は、ターゲットクラスのインスタンス(静的)なしで拡張関数を呼び出すことができることです。あなたはさらにコンストラクタのいずれかのネストされたかなどの拡張機能を望むように
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.foo(123)を呼び出す必要はありません。とにかく砂糖コード – Aracem
@WilliMentzelこれはクライアントのコンストラクタを模倣します。コンストラクタと同じ方法であり、コンストラクタと同じ方法であり、それがどれであるかを知る必要はありません。 –