名前とデフォルトのコンストラクタ引数を使用してGroovyでBuilderパターンを使用する必要性を完全に取り除くことができるかどうかを判断しようとしています。つまり、組み込みの言語機能のみを使用してテレスコープのコンストラクタの問題を解決することです。例えば必須と任意のオプションのコンストラクタ引数をGroovyと組み合わせる
は、Kotlinで、次のことを行うことが可能です:
data class Thing(val mandatory1: Int,
val mandatory2: Int,
val optional1: Int = 100,
val optional2: Int = 200,
val nullable: Int? = null)
fun main(args: Array<String>) {
val things = listOf(
Thing(1, 2),
Thing(1, 2, 3),
Thing(1, 2, 3, 4),
Thing(1, 2, 3, 4, 5),
Thing(1, 2, optional2 = 4),
Thing(1, 2, optional1 = 4),
Thing(1, 2, nullable = 4),
Thing( nullable=400,
mandatory1 = 800,
optional1 = 300,
optional2 = 700,
mandatory2 = 600))
things.forEach { t -> println(t) }
}
これは、次のような出力が得られます。
Thing(mandatory1=1, mandatory2=2, optional1=100, optional2=200, nullable=null)
Thing(mandatory1=1, mandatory2=2, optional1=3, optional2=200, nullable=null)
Thing(mandatory1=1, mandatory2=2, optional1=3, optional2=4, nullable=null)
Thing(mandatory1=1, mandatory2=2, optional1=3, optional2=4, nullable=5)
Thing(mandatory1=1, mandatory2=2, optional1=100, optional2=4, nullable=null)
Thing(mandatory1=1, mandatory2=2, optional1=4, optional2=200, nullable=null)
Thing(mandatory1=1, mandatory2=2, optional1=100, optional2=200, nullable=4)
Thing(mandatory1=800, mandatory2=600, optional1=300, optional2=700, nullable=400)
特に関心のある行がどこである:
Thing(1, 2, optional2 = 4),
収量
私は optional1を設定しなければならなかったことなし optional2を設定することができましたThing(mandatory1=1, mandatory2=2, optional1=100, optional2=4, nullable=null)
注意。 Groovyでこれが可能であるかどうかはわかりませんが、もう一度、私は専門家から遠いです。
Kotlinコンパイラは生成されたバイトコードを見て、単一のコンストラクタを生成した後、引数リストの正しいポイントにオプション引数を渡すようにインスタンス化文を書き換えます。
Groovyのエキスパートには、これはGroovyでは不可能ですか、それとも正しい構文を見つけられませんか?
事前のおかげで、
サイモン
私のfirendsの1つは、名前付き引数コンストラクタ*という名前のグルーヴィーな機能を指しています。それは、コトリンの名前のパラメターの完全な対応のようには見えませんが、いくつかの状況で動作する可能性があります。 – glee8e