2017-06-22 7 views
1

名前とデフォルトのコンストラクタ引数を使用して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では不可能ですか、それとも正しい構文を見つけられませんか?

事前のおかげで、

サイモン

+0

私のfirendsの1つは、名前付き引数コンストラクタ*という名前のグルーヴィーな機能を指しています。それは、コトリンの名前のパラメターの完全な対応のようには見えませんが、いくつかの状況で動作する可能性があります。 – glee8e

答えて

0

これはGroovyで可能です。例:

この時点では、値を割り当てることが予定されている場合でも、コンストラクタは必要ありません。このドキュメントのセクション1.4読めば

new Thing(x: "Hello", y:"World", z:6) //if you want to overwrite the defualt value of z. 

:あなただけ言うことができるhttp://groovy-lang.org/objectorientation.htmlを、それはあなたが、位置のコンストラクタまたは名前付きのコンストラクタを持つの間で選択することができると述べています。

私の例では、コンストラクタを呼び出すより多くの力を与える名前付き引数コンストラクタを使用しています。

変数を必須にするには、ポジションコンストラクターを使用する必要があります。これは、まっすぐなjavaで行われる方法に似ています。

クラスのコンストラクタを定義すると、位置コンストラクタを使用しているため、そのクラスに対して名前付き引数コンストラクタを使用できなくなります。

+0

ご返信ありがとうございます。それは私の後ろにあったものに近く、私はグルービーの素晴らしい特徴です。唯一の問題は、すべてのプロパティが現在オプションであることです。 – Simon

+0

ああそうだ。私はその質問を完全に理解していませんでした。私の答えを研究し、おそらく修正しよう。 – switch201

+0

@Smion私の新しい編集 – switch201

関連する問題